`
fastwind
  • 浏览: 319074 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

javascript继承的实现(二)

阅读更多

prototype继承是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。

只简单的这样设置继承的确如楼主所说,有不少缺点。总的来说有四个缺点:

缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。

缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于 JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有 什么影响。但是Array和Object类型就会有问题。
缺点三:如果父类的构造函数需要参数,我们就没有办法了。

缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。


我也曾经为了这四个缺点头疼过,于是对prototype继承进行改造。
我试了几种方法,下面是我觉得最好的一种。我把它写成Function对象的一个方法,这样用的时候方便。方法如下:

//类的继承-海浪版
Function.prototype.Extends = function (parentClass)
{
  var Bs = new Function();
  Bs.prototype = parentClass.prototype;
  this.prototype = new Bs();
  this.prototype.Super = parentClass;
  this.prototype.constructor = this;
}
 




prototype.js 的实现:


Object.extend=function(destination,source){
  for(property in source)
  {
  destination[property]=source[property];
  }
  return destination;
}

Object.prototype.extend=function(object){
  alert("Object.prototype.extend");
  return Object.extend.apply(this,[this,object]);
}

function class1(){
}

class1.prototype={
  method:function(){
  alert("class1.method!");
  },
  method2:function(){
  alert("class1.method2!");
  }
};

function class2(){
   
}

class2.prototype=(new class1()).extend(
  {
  method3:function(){
  alert("class2.method!");
  }
  }
);

分享到:
评论
1 楼 whynot 2009-02-17  
不错

相关推荐

Global site tag (gtag.js) - Google Analytics