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();
自我基础的理解,有错误欢迎指正