然后接下来一个for( in )循环,把基类具有的所有属性和方法都附加到子类的实例this中了,这也是我把这个继承方法叫附加法的原因。这一步和构造继承法的原理相当的类似,只是构造继承法是用了this作用域置换的一个技巧,把这个附加的过程让基类构造函数来完成了,不过同时也给构造继承法带来基类书写的特别要求,不能使用其prototype特性。当然附加法仍然是没有这个要求的。
附加继承法的Update:
Object.prototype.Extends =function(BaseClass) { if ( arguments.length >=6 ) { thrownew Error('Only can supprot at most 5 parameters.'); } var base; if ( arguments.length >1 ) { var arg01 = arguments[1]; var arg02 = arguments[2]; var arg03 = arguments[3]; var arg04 = arguments[4]; base =new BaseClass(arg01, arg02, arg03, arg04); } else { base =new BaseClass(); } for ( var key in base ) { if ( !this[key] ) { this[key] = base[key]; if ( typeof(base[key]) != 'function' ) { delete base[key]; } } } this.base = base; // base.Inherit = this; };
这样我们就的继承就可以直接写成:
function ArrayList04() { this.Extends(CollectionBase); // ... }
同时还提供了对基类继承时,传递参数给基类的支持,比如:
function ListItem() { this.Extends(ListItemBase, text, value); // ... }