乐趣区

浅谈部分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()。开发人员普遍认为寄生组合式继承是引用类型最理想的继承方式。

退出移动版