js实现继承的6中方法

ECMAcript支持实现继承的方法主要依靠原型链。


1. 原型链

每个构造函数都有一个原型对象,原型对象都有一个指向构造函数的指针(constructor),而实例对象都有一个指向原型对象的内部指针。构造函数的原型对象如果指向另一个类型的实例。例子:

function SuperObj() {
    this.property = true;
}
SuperObj.prototype.getVal = function() {
    return this.property;
}
function SubObj() {
    this.subproperty = false;
}
//继承SuperObj
SubObj.prototype = new SuperObj();
//再使用字面量来添加方法,会重写原型对象导致上行代码无效
SubObj.prototype = {
    getSubVal: function() {
        return this.subproperty;
    },
    otherMethod: function() {
        return false;
    }
}
var instance = new SubObj();
alert(instance.getVal()); //error

当不使用字面量重新定义原型时,上面的调用会弹出true,这是通过原型链的搜索机机制实现的。

  • 可以看的通过原型实现继承时,所有实例都会共享原型对象上的属性与方法,当某一实例对原型对象进行更改时也会反应到其他的实例对象上,这显然是不合理的。
  • 创建的子类型无法向超类型传递参数。

2. 借用构造函数实现继承

通过在子类型中调用超类型的构造函数来实现。例子:

function SupObj() {
    this.color = ['red', 'blue'];
}
function SubObj(){
    //继承SupObj
    **SupObj.call(this);**
}
var inst1 = new SubObj();
inst1.color.push('pink');
alert(inst1.color);  //"red, blue, pink"
var inst2 = new SubObj();
alert(inst2.color); //"red, blue"

通过借调超类的构造函数,使每个子类实例都有自己的color属性副本。


3. 组合继承

将原型链和借用构造函数技术组合到一起。通过原型链实现对原型属性和方法的继承,而通过借用构造函数的方法实现对实例属性的继承。例子:

function SuperObj(name) {
    this.name = name;
    this.colors = ['red', 'blue'];
}
SuperObj.prototype.sayName = function() {
    alert(this.name);
}
function SubObj(name, age){
    //继承属性
    SuperObj.call(this, name);
    this.age = age;
}
//继承方法
SubObj.prototype = new SuperObj();
SubObj.prototype.sayAge = function() {
    alert(this.age);
}

这样就是实现了对父类属性与方法的继承,并继承上两个实现继承方法的优点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值