javascript不常用的系列三(OO继承)

1.javascript推荐的组合式继承
eg:

function SuperType(name) {
    this.name = name,
    this.colors = ['red','green','black']
}
SuperType.prototype.sayName =function() {
    alert(this.name)
}
function SubType(name,age) {
//第二次调用SuperType()
    SuperType.call(this,'dhq'); //继承父类。继承之后SubType包含父类所有的属性
    this.age = age
}
//第一次调用SuperType()
SubType.prototype= new SuperType(); //继承父类方法,继承之后SubType包含父类所有的方法
SubType.prototype.constructor = SubType;
SuperType.prototype.sayAge =function() {
    alert(this.age)
}

上面代码的解释:在第一次调用SuperType构造函数时,SubType.prototype会得到两个属性,name和colors,只不过现在是位于SubType.prototype上的。
当第二次调用SuperType构造函数时,又一次在新对象的上创建了两个属性,name和colors,,于是这两个属性也就屏蔽了原型中的两个同名的属性。

为了解决两次的问题也就诞生了所谓的终极方案。寄生组合式继承

2.寄生组合式继承 基于类型继承最有效的方式

思路就是通过构造函数来继承属性,通过原型链的混成形式来继承方法。

function inheritPrototype (subType,superType) {
    var prototype = object(SuperType.prototype);//创建对象
    prototype.constructor = subType;
    subType.prototype = prototype;
}
解释:函数内部第一行创建超类型的一个副本 
第二行为副本添加constructor属性,避免因为重写原型而失去constructor属性
第三行将副本赋值给子类原型

最终使用如下:

function SuperType(name) {
    this.name = name,
    this.colors = ['red','green','black']
}
SuperType.prototype.sayName =function() {
    alert(this.name)
}
function SubType(name,age) {
    SuperType.call(this,'dhq'); 
    this.age = age,
}
inheritPrototype(subType,superType);
SuperType.prototype.sayAge =function() {
    alert(this.age)
}

高效性在于只调用了一次超类型,避免了在SubType.prototype上创要的属性。因此这种方式是开发人员认为对引用类型最理想的继承范式。

//之后会补充部分关于es6 class的原型与继承相关知识…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值