ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来), call 和 apply 。这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值 。
语法
call(thisObj,Object)
定义
调用一个对象的一个方法,以另一个对象替换当前对象
说明
call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文变为由thisObj指定的新对象,如果没有提供thisObj参数,那么Golbal对象被用作thisObj
用法 调用函数,传递参数
function add(x,y) {
return x+y
}
//用call来调用add方法
function myAddCall (x,y) {
//调用add方法的call方法
return add.call(this,x,y);
}
console.log(myAddCall(10,20)) //输出30
改变函数作用域 var name='小白'
var obj = {name:'小红'};
function sayName() {
return this.name
}
console.log(sayName.call(this))//小白
console.log(sayName.call(obj));//小红
//父类 Person
function Person() {
this.sayName = function() {
return this.name;
}
}
//子类 Chinese
function Chinese(name) {
//借助 call 实现继承
Person.call(this);
this.name = name;
this.ch = function() {
alert('我是中国人');
}
}
//子类 America
function America(name) {
//借助 call 实现继承
Person.call(this);
this.name = name;
this.am = function() {
alert('我是美国人');
}
}
//测试
var chinese = new Chinese('成龙');
//调用 父类方法
console.log(chinese.sayName()); //输出 成龙
var america = new America('America');
//调用 父类方法
console.log(america.sayName()); //输出 America