扩展而不是覆盖原型

时间:2011-02-24 00:53:03

标签: javascript inheritance

在我们当前的代码库中,我们正在创建这样的类

my_class = function(){
  //do some constructor stuff
}

my_class.prototype = {
  var1 : 'value',
  var2 : 'value',
  var3 : 'value'
  .
  .
  .
  //etc
}

有几个这样的类我想继承一个超类。但是,如果我做这样的事情,我最终会覆盖超类的原型。

my_super_class = function(){

}

my_super_class.prototype.generic_function = function(){
  //all subclasses should have this function
}

my_subclass = function(){
  //constructory stuff
}

//inherit the superclass
my_class.prototype = new my_super_class();

my_class.prototype = {
  //oops, there goes my superclass prototype...
  var1 : 'value',
  var2 : 'value',
  var3 : 'value'
  .
  .
  .
  //etc
}

有没有比my_class.prototype.val1 ='value'更好的方法呢?继承超类之后......等等?我想遵循我们当前代码库中的约定,因为它很简短。

4 个答案:

答案 0 :(得分:3)

您使用任何库或框架吗?如果你这样做,你可能会使用像Prototype的Object.extend或jQuery.extend这样的东西。

您可能还会发现有趣的是来自Object.create的新ECMA-262 5th Edition

答案 1 :(得分:3)

你可以做的是写一个merge函数:

function merge(one, other) {
  for(var k in other) {
    if(other.hasOwnProperty(k) && !one.hasOwnProperty(k)) {
       one[k] = other[k];
    }
  }
}

然后,您可以使用prototype

执行此操作
merge(my_class.prototype, {
   var1 : 'value',
   var2 : 'value',
   var3 : 'value'
   .
   .
   .
  //etc
});

答案 2 :(得分:2)

您可以编写一个处理属性赋值的函数:

function extend(a, b) {
    for(var prop in b) {
        if(b.hasOwnProperty(prop)) {
            a[prop] = b[prop];
        }
    }
}

my_class.prototype = new my_super_class();

var my_class_proto  = {
    //...
}

extend(my_class.prototype, my_class_proto);

答案 3 :(得分:0)

我也在努力为JavaScript中的那些东西找到一个很好的语法,但我看到过这样的东西:

// inherit the superclass
myClass.prototype = new mySuperClass();

(function() {
    this.var1 = 'value';
    this.var2 = 'value';
    // etc.
}).call(myClass.prototype);

这似乎比编写myClass.prototype更好。