原型繼承(JS中最常用的一種繼承方式)
- 子類B想要繼承父類A中所有的屬性和方法(私有+公有),只需要B.prototype = new A();即可
- 原型繼承的特點:它是把父類中私有的+公有的都繼承了子類原型上(子類的公有的)
- 核心:原型繼承并不是把父類中的屬性和方法克隆一份一模一樣的給B,而是讓B和A之間增加了原型鏈的連接,以后B的實例想要A中的getX方法,需要一級級的向上查找來使用
function A() {
this.a = 'aaa';
this.b = function () {
console.log('bbb')
}
}
A.prototype.c = 'ccc';
A.prototype.d = function () {
console.log('ddd')
}
function B() { }
B.prototype = new A();
console.log(new B());
call繼承
-
把父類私有的屬性和方法,克隆一份一模一樣的作為子類私有的屬性
function A(){ this.a = 'aaa'; this.b = function(){ console.log('bbb'); } } A.prototype.c = 'ccc'; A.prototype.d = function(){ console.log('ddd'); } function B(){ A.call(this); } console.log(new B())
冒充對象繼承
- 把父類私有的+公有的克隆一份一模一樣的給子類私有的
function A(){
this.a = 'aaa';
this.b = function(){
console.log('bbb');
}
}
A.prototype.c = 'ccc';
A.prototype.d = function(){
console.log('ddd');
}
function B(){
let temp = new A();
for(let attr in temp){
this[attr] = temp[attr];
}
temp = null;
}
console.log(new B());
混合模式繼承
- 原型繼承+call繼承
function A(){
this.a = 'aaa';
this.b = function(){
console.log('bbb');
}
}
A.prototype.c = 'ccc';
A.prototype.d = function(){
console.log('ddd');
}
function B(){
A.call(this);
}
B.prototype = new A();
B.prototype.constructor = B;
console.log(new B());
寄生組合式繼承
function A(){
this.a = 'aaa';
this.b = function(){
console.log('bbb');
}
}
A.prototype.c = 'ccc';
A.prototype.d = function(){
console.log('ddd');
}
function B(){
A.call(this);
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
console.log(new B());