一、call() 函数
语法:
Function.call(obj,param1,param2,…paramN)
>参 obj: 这个对象将代替Function类里this对象
>参 params: 是一个参数列表
示例:
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function() {
console.log(this.color);
};
}
function ClassB(sColor, sName) {
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function() {
console.log(this.name);
};
}
var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor(); //blue
objB.sayColor(); //red
objB.sayName(); //john
console.log(objB.hasOwnProperty("color"));//true
注释:call()它的第一个参数用来传递当前环境下的函数的this的对象,保持this的一致性,后面的参数列表将传递给调用call()的函数。
二 、apply() 函数
语法:
Function.apply(obj,args)
>参 obj: 这个对象将代替Function类里this对象
>参 args: 数组参数,必须是数组
示例:
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function() {
console.log(this.color);
};
}
function ClassB(s,sColor, sName) {
ClassA.apply(this, arguments);
this.name = sName;
this.sayName = function() {
console.log(this.name);
};
}
var objA = new ClassA("blue");
var objB = new ClassB(10,"red","John");
objA.sayColor(); //blue
objB.sayColor(); //10
objB.sayName(); //John
注释:与call()类似,第一个参数用来传递当前环境下的函数的this的对象,保持this的一致性。第二个参数只能是一个数组。可以把ClassB的整个arguments
对象作为第二个参数传递给 apply()方法,但是要注意,子类在接收父类的arguments对象作为参数时,只会按照顺序一一读取对应,并不会识别参数含义。
注释:apply()有一个妙用,第二参数可以将数组默认的转换为一个参数列表【[param1,param2,param3]转化为:param1,param2,param3】
示例:JavaScript Math 对象的 Math.max() 方法
支持多个参数,将返回最大的那个数字,但是要注意,此处的max()方法参数不能使用数组
console.log(Math.max(1,23,5,6,88)); // 88
var arr = new Array(1,23,5,6,88);
console.log(Math.max(arr)); //NaN
console.log(Math.max.apply(null,arr)); //88
注释:这里的 Math.max()不支持参数使用数组,正常情况下我们就需要来拆解数组,再一个个的传递给max函数。这时,我们可以利用apply()的可以转化数组为参数列表特性。调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,并且我们只需要得到结果即可。
注释:所有类似Math.max()的方法都可以使用上述方式便捷操作,例:Math.min(),Array.push()等。
博文不长,旨在精炼