call 方法的使用
官方文档是这么说的:调用一个对象的一个方法,以另一个对象替换当前对象。
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
官方文档写的太复杂,通过实例来测试。
function Person(name) {
this.name = name;
this.show = function () {
console.log(this.name);
}
}
function Man() {
this.name = "Lucy";
}
var person = new Person("Jack");
var man = new Man();
person.show.call(man); // "Lucy"
此处输出的是 "Lucy"
,call
的意思是:将 Person
对象的 show
方法,放到 Man
对象中去执行,也就是说:在 Man
对象中去执行 Person
对象的 show
方法。
此时 show
方法被放置到 Man
对象中执行,方法中的 console.log(this.name);
就已经指向的是 "Lucy"
。
apply 方法的使用
apply
和call
方法的功能一致,不一样的地方在于参数列表。apply
和call
接收的第一个参数一样,都是对象,而第二个参数apply
接收的是一个数组、call
接收的是一个参数列表。
- Function.apply(object, args)
- Function.call(object,args ...)
通过 call 或 apply 实现继承
function Person(name) {
this.name = name;
}
function Man(name, age) {
Person.call(this, name);
this.age = age;
}
var man = new Man("Lucy", 18);
console.log(man); // Man{name: "Lucy", age: 18}
多重继承
function Person(name) {
this.name = name;
}
function Student(sex) {
this.sex = sex;
}
function Man(name, sex, age) {
Person.call(this, name);
Student.call(this, sex);
this.age = age;
}
var man = new Man("Lucy", 'M', 18); // Man{name: "Lucy", sex: 'M', age: 18}
console.log(man);