Расширение вместо перезаписи прототипа - PullRequest
4 голосов
/ 24 февраля 2011

В нашей текущей кодовой базе мы создаем классы, подобные этому

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 ]

3 голосов
/ 24 февраля 2011

Вы используете какую-либо библиотеку или фреймворк?Если вы это сделаете, есть вероятность, что вы можете использовать что-то вроде Object.extend Prototype или jQuery.extend.

Что вам также может быть интересно, это новый Object.create из ECMA-262, 5-е издание .

3 голосов
/ 24 февраля 2011

Что вы можете сделать, это написать функцию 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 голосов
/ 24 февраля 2011

Вы можете написать функцию, которая обрабатывает присвоение свойств для вас:

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);
0 голосов
/ 02 июня 2011

Я также изо всех сил пытаюсь найти хороший синтаксис для этих вещей в JavaScript, но я видел что-то вроде этого:

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

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

Что кажется приятнее, чем писать myClass.prototype все время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...