第一種方式:js使用構(gòu)造函數(shù)的繼承追迟。
缺點:無法繼承父類的原型鏈溶其。
// 構(gòu)造函數(shù)繼承 缺點:沒有繼承原型鏈
function Parent1(){
? this.name = 'Parent'
}
Parent1.prototype.sayParent = function(){
? console.log('say Parent!')
}
function Child(){
? Parent1.call(this)
? this.type = 'child'
}
var child = new Child()
console.log(child) // 下面運行結(jié)果?
child.sayParent() // 不能繼承父類原型的方法
第二種:使用原型鏈繼承的方式
// 缺點:父類的屬性為引用類型時候,子類實例眾多使用敦间,有一個修改瓶逃,其它也會變成修改值
function Parent2() {
? this.name = "Parent";
? this.ary = [1,2,3]
}
Parent2.prototype.sayParent = function() {
? console.log("say Parent!");
};
function Child() {
? this.type = "child";
}
Child.prototype = new Parent2();
var child1 = new Child();
var child2 = new Child();
console.log(child1.ary);
console.log(child2.ary);
child1.ary.push(5)
console.log(child1.ary);?
console.log(child2.ary) // 這里也造成了ary 數(shù)組也增加了
child1.sayParent();
第三種 // 使用組合繼承的方式。
解決了上面兩種缺點廓块。
function Parent3() {
? this.name = "Parent";
? this.ary = [1,2,3]
}
Parent3.prototype.sayParent = function() {
? console.log("say Parent!");
};
function Child() {
? Parent3.call(this);
? this.type = "child";
}
Child.prototype = Object.create(Parent3.prototype);
Child.prototype.constructor = Child;
var child1 = new Child();
var child2 = new Child();
console.log(child1.ary);
console.log(child2.ary);
child1.ary.push(5)
console.log(child1.ary);
console.log(child2.ary)
child1.sayParent();
console.log(child1.constructor);