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);
