個人總結: call 繼承的是父類私有
prototype 繼承的父類公有
create 可以將公有或私有繼承到子類上去(克隆)
for in 克隆 不管公有還是私有的都克隆成私有的
1.原型繼承:將父類的私有和公有都繼承子類的原型上。子類的原型等於父類的例項。(私有公有全部繼承)
function A() {
this.name=`aaa`
}
A.prototype.x=50;
function B() {
this.age=`bbb`
}
B.prototype.y=100;
B.prototype=new A;
var a=new A;
var b=new B;
console.log(“xsx——=”+b.x); //50
console.log(“xsx——=”+b.name);//aaa
2.call繼承:將父類的私有繼承子類的私有。(prototype為公有)
function A() {
this.name=`aaa`
}
A.prototype.x=50;
function B() {
this.age=`bbb`
A.call(this)
}
B.prototype.y=100;
var a=new A;
var b=new B;
console.log(“xsx——=”+b.x); //undefined
console.log(“xsx——=”+b.name); //aaa
3.冒充物件繼承:將父類的私有和公有都繼承子類私有的。
function A() {
this.name = `aaa`
}
A.prototype.x = 50;
function B() {
this.age = `bbb`
var teme = new A
for (var k in teme) {
this[k]=teme[k]
}
}
B.prototype.y = 100;
var a = new A;
var b = new B;
console.log(“xsx——=” + b.x); //50
console.log(“xsx——=” + b.name);//aaa
4.混合繼承:將父類私有繼承子類私有,再將父類的私有和公有繼承子類公有。採用call繼承和原型繼承,私有被繼承兩次。
function A() {
this.name = `aaa`
}
A.prototype.x = 50;
function B() {
this.age = `bbb`
A.call(this) //call 是用來繼承私有的
}
B.prototype.y = 100;
B.prototype = new A;
var a = new A;
var b = new B;
console.log(“xsx——=” + b.name);//aaa
5.組合繼承:私有繼承私有,公有繼承公有
function A() {
this.name = `aaa`
}
A.prototype.x = 50;
function B() {
this.age = `bbb`
A.call(this) //call 是用來繼承私有的
}
B.prototype =Object.create(A.prototype); //繼承私有
B.prototype.y = 100;
var a = new A;
var b = new B;
console.log(“xsx——=” + b.name);//aaa