🎉原型继承
原型继承存在一个问题就是引用传递的问题,上代码
//原型继承这种情况下是没有问题的
function Super(){
this.a = '333'
}
Super.protopyte.say = function(){
console.log('你好')
}
function Sub(){
}
let sub1 = new Sub()
let sub2 = new Sub()
sub1. a = '111'
console.log(sub1.a)//111
console.log(sub2.a)//333
//原型继承这种情况下是有问题的
function Super(){
this.a = [1,2,3]
}
Super.protopyte.say = function(){
console.log('你好')
}
function Sub(){
}
Sub.prototype = new Super()
let sub1 = new Sub()
let sub2 = new Sub()
sub1.a.push(4)
//这就是引用传递的问题
console.log(sub1.a)//[1,2,3,4]
console.log(sub2.a)//[1,2,3,4]
🎉构造函数继承
通过构造函数继承可以解决上述的问题,但是还有一个问题是这样就拿不到say方法了
//构造函数继承
function Super(){
this.a = [1,2,3]
}
Super.protopyte.say = function(){
console.log('你好')
}
function Sub(){
//要改变this的指向
Super.call(this)
}
let sub1 = new Sub()
let sub2 = new Sub()
sub1.a.push(4)
//这就解决了引用传递的问题
console.log(sub1.a)//[1,2,3,4]
console.log(sub2.a)//[1,2,3]
🎉组合继承
这样就可以解决之前的两个问题,但是还是存在着一个问题就是,这样相当于Super调用了两次实例,就显得不合理
//构造函数继承
function Super(){
this.a = [1,2,3]
}
Super.protopyte.say = function(){
console.log('你好')
}
function Sub(){
//要改变this的指向
//第一次调用Super
Super.call(this)
}
//第二次调用Super
Sub.prototype = new Super()
let sub1 = new Sub()
let sub2 = new Sub()
sub1.a.push(4)
//这就解决了引用传递的问题
console.log(sub1.a)//[1,2,3,4]
console.log(sub2.a)//[1,2,3]
🎉寄生组合继承
可能存在原来的Sub原型上的方法不能使用的问题
//构造函数继承
function Super(){
this.a = [1,2,3]
}
Super.protopyte.say = function(){
console.log('你好')
}
function Sub(){
//要改变this的指向
//第一次调用Super
Super.call(this)
}
//第二次调用Super
//Sub.prototype = new Super()
//Sub.prototype = Objec.creat(Super.prototype)//ES5
//兼容
if(!Object.create){
Object.create = function(proto){
function F(){
F.prototype = proto
return new F()
}
}
}
Sub.prototype = Objec.creat(Super.prototype)
let sub1 = new Sub()
let sub2 = new Sub()
sub1.a.push(4)
//这就解决了引用传递的问题
console.log(sub1.a)//[1,2,3,4]
console.log(sub2.a)//[1,2,3]
🎉ES6继承
class Super{
}
class Sub extends Super{
}