//1.原型繼承
//缺點: 當父級的屬性有引用類型的時候,任意一個實例修改了這個屬性,其他實例都會受影響
// 1)基本類型:Number Boolean String undefined null
// 2)引用類型:Object Function
function Person(){
this.class = '人';
this.name = '張三';
this.say = function(){
console.log(this.name);
}
};
function Man(name,age){
this.name = name;
this.age = age;
};
Man.prototype = new Person();
var man = new Man('廣發',18);
console.log(man);
//2.借用構造函數繼承
//缺點:父類的方法會被創建多次
function Person(){
this.class = '人類';
this.say = function(){
console.log('我是人類');
}
}
function Man(name,age){
this.name = name;
this.age = age;
//借用構造函數
Person.call(this);
}
var man = new Man('廣發',18);
console.log(man);
var man2 = new Man('廣發',20);
console.log(man.say===man2.say);//false
//3寄生式繼承
function Person(o){ //參數o是一個傳進來的對象
缺點:沒用到原型,無法復用
var obj = Object.create(o);
//console.log(obj._proto_ === o); //false
obj.class = '人類';
obj.say = function(){
console.log(this.name);
}
return obj;
}
//要傳入的對象
var aman = {
name:'廣發',
age:100
}
var man = Person(aman);
console.log(man);
//4.組合式繼承
//唯一缺點:父類的構造器被調用了兩次
function Father(){ //父級
this.class = '人類';
alert('測試被調用多少次');
};
Father.prototype.say = function(){ //把方法放到原型里
console.log(this.name);
}
function Child(name,age){
this.name = name;
this.age = age;
Father.call(this);//借用構造函數
}
Child.prototype = new Father();//Child原型繼承了Father,這樣就可以調用原型里面的方法了
var man = new Child('廣發',18);
console.log(man);
var man2 = new Child('廣發',20);
console.log(man.say === man2.say);//true,因為在原型里面都能調用,所以他們這個方法是相等的
// 5 終極版 寄生組合式繼承
//什么?缺點?你信不信我打你
function Person(){
this.class = '人類';
alert('測試調用了幾次');
}
Person.prototype.say = function(){
console.log(this.name);
}
Man.prototype = Object.create(Person.prototype);
function Man(name,age){
this.name = name;
this.age = age;
Person.call(this);
}
var man = new Man('廣發',18);
console.log(man);
有時候玩着玩着就找不到原型構造器了,所以我們要重新找回構造器
//構造器重定向(找回構造器)
Man.prototype.constructor = Man;
1. 每個函數都包含兩個非繼承而來的方法:call()方法和apply()方法。
2. 相同點:這兩個方法的作用是一樣的。
都是在特定的作用域中調用函數,等於設置函數體內this對象的值,以擴充函數賴以運行的作用域。
一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時,就會改變this的指向。
說明: call方法可以用來代替另一個對象調用一個方法,call方法可以將一個函數的對象上下文從初始的上下文改變為thisObj指定的新對象,如果沒有提供thisObj參數,那么Global對象被用於thisObj。
簡單明了
call:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.call(A, args1,args2);即A對象調用B對象的方法。
