浅谈部分js继承范式

原型链继承
function SuperType() {}
SuperType.prototype = {a: 'va'}

function SubType() {}
SubType.prototype.__proto__ = SuperType.prototype
/** 
 * 由于 SubType.prototype.constructor = SubType
 * 即 SubType.prototype = new SubType()
 * 所以 new SubType().__proto__ = SuperType.prototype
 */
var sub = new SubType()

console.log(sub)

 

寄生继承
function shell(args) {
    console.log('shell的上下文____', this)
    var core = function() {
        console.log('core的上下文____', this)
    }
    core.prototype = args
    return new core()
}
var shellReturn = shell({a: 'va', b: 'vb'})

console.log(shellReturn)

评价:适合拓展属性和方法

 

寄生组合继承
function SuperType(a) {
    this.a = a
}
SuperType.prototype.sayA = function() {
    console.log('super.a____', this.a)
}

function SubType(a, b) {
    SuperType.call(this, a)
    this.b = b
}
SubType.prototype.__proto__ = SuperType.prototype
SubType.prototype.sayB = function(){
    console.log('sub.b____', this.b)
}
var sub = new SubType('va', 'vb')

console.log(sub)

评价:寄生组合式继承的高效率体现在它只调用了一次SuperType构造函数,并且因此避免了再SubType.prototype上面创建不必要的、多余的属性。与此同时,原型链还能保持不变。因此,还能够正常使用instanceof和isPrototypeOf()。开发人员普遍认为寄生组合式继承是引用类型最理想的继承方式。

    原文作者:didengren
    原文地址: https://segmentfault.com/a/1190000020874856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞