`
风雪涟漪
  • 浏览: 496822 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:8764
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:17659
社区版块
存档分类
最新评论

Javascript 继承 (四)

阅读更多

封装继承

通过上面的学习,我们把继承封装,这样就可复用了。代码如下

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链。)

 

分享到:
评论
1 楼 lipengyu2006 2009-02-27  
extend2方法中 如果p 和 c中有相同的属性  是不是就被覆盖了
调用toString()方法会输出什么呢

相关推荐

Global site tag (gtag.js) - Google Analytics