认识 JavaScript 3

本文探讨了JavaScript中实现继承的不同方法,包括使用原型链进行单一继承和通过原型链扩展及函数副本实现多重继承的技术细节。

继承的方式

看到继承方式中,“比较好的”是《JavaScript 设计模式》上的这种。

function extend(subClass,superClass){
    var F = function(){};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;
}

实质是:

subclass.prototype.__proto__ = superClass.prototype;
不惜完全覆盖子类原型的原因是,__proto__ 不是标准。

subClass.superClass = superClass.prototype
或许还可以加上这句,明确下子类和父类的边界。


多重继承

我想到的多重继承的法子是,在已有原型链尾部插入其他原型。

书上的法子,直接为原型添加父类原型函数副本。

    function augment(receivingClass, givingClass) {
            for (var methodName in givingClass.prototype) {
                if (!receivingClass.prototype[methodName]) {
                    receivingClass.prototype[methodName] = givingClass.prototype[methodName];
                }
            }
        }

例子还是很糟糕的,for in 会遍历整个原型链,结果连 Object 的原型方法也复制了。

而这个法子本身也不好,这是 js 单继承的局限。实现多继承居然拷贝父类函数。

而我自己的法子,会把原型链无限变长。


说点轻松的 小技巧

比如上面的,

if (!receivingClass.prototype[methodName]) {
}
又或是经常遇到的,

function abc(arg){
    var a = arg || ...
}
都是 undefined 类型转换的实际应用。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值