1. 原型链继承:方法的原型是某个类的实例,即可继承这个类的所有属性和方法。父类私有和公有的属性都变为子类公有的。( 因为子类和父类还有联系,子类.proto 可以修改原型链上的属性,所有出现了以下四种继承法?)
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
this.y = 200;
}
B.prototype.sayHello = function(){
console.log(20000);
};
B.prototype = new A();
B.prototype.constructor = B;
function C(){
this.c = 300;
}
C.prototype.sayC = function(){
console.log("ccc");
}
C.prototype = new B();
2. call 继承:把父类私有的变为子类私有的。
function A(){
this.x = 100;
}
function B(){
A.call(this);
}
var n = new B();
n.x; // 100
3. 冒充对象继承:把父类私有的和公有的克隆一份给子类作为私有。
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
}
function B(){
var temp = new A();
for(var key in temp){
this[key] = temp[key];
}
temp = null;
}
var n = new B();
4. 混合模式继承:原型继承 + call 继承,父类私有的变为子类私有的,父类私有和共有的都变为子类公有的。
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
}
function B(){
A.call(this);
}
B.prototype = new A(); // B.prototype.x = 100 私有属性重复继承。
B.prototype.constructor = B;
var n = new B();
n.getX();
5. 寄生组合式继承:父类私有的变为私有的(call 继承),父类公有的变为子类公有的。
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
}
function B(){
A.call(this);
}
//B.prototype = Object.create(A.prototype);
B.prototype = objectCreate(A.prototype); // 兼容
B.prototype.constructor = B;
var n = new B();
n.getX();
function objectCreate(o){
function Fn(){}
Fn.prototype = o;
return new Fn();
}
网友评论