继承的方式
看到继承方式中,“比较好的”是《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 类型转换的实际应用。