call 方法的使用
官方文檔是這么說的:調(diào)用一個對象的一個方法,以另一個對象替換當(dāng)前對象。
call 方法可以用來代替另一個對象調(diào)用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。
如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj。
官方文檔寫的太復(fù)雜,通過實(shí)例來測試。
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
對象中去執(zhí)行,也就是說:在 Man
對象中去執(zhí)行 Person
對象的 show
方法。
此時 show
方法被放置到 Man
對象中執(zhí)行,方法中的 console.log(this.name);
就已經(jīng)指向的是 "Lucy"
。
apply 方法的使用
apply
和call
方法的功能一致,不一樣的地方在于參數(shù)列表。apply
和call
接收的第一個參數(shù)一樣,都是對象,而第二個參數(shù)apply
接收的是一個數(shù)組、call
接收的是一個參數(shù)列表。
- Function.apply(object, args)
- Function.call(object,args ...)
通過 call 或 apply 實(shí)現(xiàn)繼承
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);