Разница наследования прототипа Javascript - PullRequest
0 голосов
/ 09 июля 2009
 function main()
{
  this.one = 1;
}

main.prototype = {
  display: function()
  {
    console.log(this.one);
    return this;
  }
};

function addition() {
  main.call(this);
}

addition.prototype = new main;
addition.prototype.constructor = addition;

addition.prototype = {
  add: function(x) {
    this.one += x;
    return this;
  }
};

// addition.prototype.add = function(x)
// {
//   this.one += x;
//   return this;   
// }

display = new addition;
display.add(3).add(5).display();

Если я заменим закомментированный дополнение. Prototype.add на добавочный прототип над ним, он будет работать нормально, регистрируя «9». В противном случае выполнение приведенного выше фрагмента приведет к появлению «display.add (3) .add (5) .display не является функцией» в Firebug 1.4, Firefox 3.5.

В чем разница между двумя сегментами? Я всегда думал, что они одинаковы, посоветуйте, пожалуйста, разницу, и / или как я могу заставить ее работать с закомментированными кодами.

Или, по крайней мере, укажите мне ключевые слова, по которым я должен искать Google, я пытался искать напрасно часами.

Спасибо.

1 Ответ

4 голосов
/ 09 июля 2009

Похоже, вы переписываете прототип родительского (основного) кода:

addition.prototype = {
  add: function(x) {
    this.one += x;
    return this;
  }
};

добавление. Prototype теперь является новым объектом, потому что вы только что присвоили ему.

Когда вы делаете:

addition.prototype.add = function(x) {
 this.one += x;
 return this;   
}

Вы добавляете свойство к addition.prototype, поэтому сохраняете унаследованную от main display() функцию.

Кстати, откуда вы взяли этот код? Это один из самых запутанных примеров наследования в JavaScript, который я видел.

...