封装继承
通过上面的学习,我们把继承封装,这样就可复用了。代码如下
function extend(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; }
我们可以调用这个方法实现继承。
extend(TwoDShape, Shape); extend(Triangle, TwoDShape);
许多开源库都实现了继承,如YUI 你可以如下用法
YAHOO.lang.extend(Triangle, Shape)
复制属性
继承也不过是为了代码复用,我们可以利用复制属性的方法。看看如下代码
function extend2(child,parent){
var p = parent.prototype;
var c = child.prototype;
for(var i in p){
c[i] = p[i];
}
c.uber = p;
}
上面的代码,循环了父对象的所有属性,并不像上个例子,没有必要重置child.prototype.constructor。因为这次是扩展了child.prototype.并不是重写。因此这个constructor的属性指向的是当前的值。
当然这个继承方法比第一种效率更低。原因就是第二种的child.prototype的属性被复制了,并不像第一种通过prototype链去查找的。
但是一定要记住,只有属性被复制了。所有的对象并没有被复制,仅仅专递的是引用而已。
虽然效率低点,但是仅仅是属性复制而已,有好处的是,当调用方法的时候,会更快的找到所需要的方法(也就是查找更少的prototype链。)