JS小红书-继承的几种实现方式
继承这篇和对象创建模式可以一起看,千丝万缕的关系,相信只要理解了一个,就能都搞定。有些面试还是很喜欢问这些的。当然这些都是js基础,都是实打实的砖头,掌握这些,未来的路才走的更稳健。
- 原型链继承
- 构造函数继承
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承 ps:以下代码部分只贴主要继承部分
1.原型链继承
//继承了SuperType
SubType.prototype = new SuperType()
2.构造函数继承
function SubTypeSuperType(){
//继承了SuperType
SuperType.call(this)
}
3.组合继承
function SubTypeSuperType(){
//继承了SuperType
SuperType.call(this) //第二用SuperType
}
SubType.prototype = new SuperType() //第一次调用SuperType
优点
构造函数中定义属性,原型定义方法,实现属性私有,方法共享
缺点
第一次调用SuperType,SubType.prototype 会得到SuperType的属性,第二用SuperType,又会得到SuperType的属性,这一次是属性是在实例上,于是这2个属性就屏蔽了原型链上的同名属性
4.原型式继承
自定义object
function object(o){
function F(){}
f.prototype=o
return new F()
}
var person={
name:'jack',
age:15
}
//通过object实现继承
var person1=object(person)
Object.create()
var person1=Object.create(person)
//Object.create() 接受2个参数,一个用作新对象原型的对象,一个为新对象定义额外属性的对象。
//第二个参数和object.defineProperties 第二个参数格式一样
var person2=Object.create(person,{
name:{
value:'tom'
}
})
5.寄生式继承
function createAnother(original){
var clone = object(original)
clone.sayHi = function(){
console.log('h1')
}
return clone
}
6.寄生组合式继承
function inheritPropertype(subType,superType){
//prototype 的原型对象是superType的原型对象的原型对象
var prototype = object(superType.prototype)
//prototype 的constructor 指向subType
prototype.constructor = subType
//subType的原型对象指向prototype
subType.prototype = prototype
}
和组合继承相比,借用构造函数继承属性,通过原型链继承方法。 且高效率之处体现在只调用了一次superType构造函数,并且避免了在subType.prototype上创建不必要的属性,与此同时,原型链保持不变。因此还能正常的使用instanceof 和isPropertyOf()。extend()方法也是采用了寄生组合式继承