淺談部分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()。開發人員普遍認爲寄生組合式繼承是引用類型最理想的繼承方式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章