js apply和call

2017-11-10  本文已影响0人  AngleYan

apply和call

1. 每个函数都有两个非继承而来的方法;call和apply
2. 相同点:设置函数体内this的指向,以扩展赖以运行的作用域
 一般来说,this总是指向调用某个方法的对象,它俩都是改变this的指向。

apply的实例

apply的用法

apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

var obj = {
        "a":1,
        "b":2,
        show:function () {
            console.log(this.a)
        }
    }
    var obj2 = {
        "a":3
    }
    obj.show.apply(obj2);//其实相当于obj2,继承了obj里面的show方法,所以show里面的this指向了obj2
    obj.show.apply('');//由于‘’字符串调用obj的show方法,show里面的this指向了‘’字符串
    obj.show.apply(window);//this指向了window
    obj.show.apply(document);//window
    obj.show.apply();//默认是指向全局的window
    obj.show.apply(undefined);//指向全局的window

call方法

call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

function Animate() {
        this.name = 'abc';
        this.type =1;
        this.getName = function () {
            console.log(this.name)
            return this.name;
        }
        this.setName = function (name) {
            this.name = name;
        }
    }

    function Dog() {
        this.name = 'dog';
        Animate.call(this);//dog是动物的子类;call和apply有继承的特性,改变当前对象的指向
//重写父类的方法
        this.getName = function () {
            console.log('&&&&&&')
            console.log(this.name)
            return this.name;
        }
        this.setName = function (name) {
            this.name = name;
        }


    }


    var dog = new  Dog();
    dog.setName('dog1');
    dog.getName();

自我基础的理解,有错误欢迎指正

上一篇下一篇

猜你喜欢

热点阅读