Наследование JavaScript — объекты, объявленные в конструкторе, совместно используются экземплярами?

Если Вам нравится, как работы haml с точки зрения кодирования, не волнуйтесь о производительности механизма шаблонной обработки слишком много. (Хотя, как Вы указали, это теперь быстро.) Это может определенно генерировать любой вывод, другие механизмы могут.

Обычно является более прибыльным поместить Вашу энергию в установку кэширования, чем волнение по поводу Вашего механизма шаблонной обработки, где у Вас есть проблемы производительности.

8
задан Sam Lee 28 September 2009 в 07:22
поделиться

2 ответа

Проблема в том, что ваша функция конструктора A запускается только один раз для всех экземпляров B , поэтому this.y ссылка только на один массив. Любая ссылка на него из B будет разрешена через цепочку прототипов к единственной центральной ссылке A , которая имеет только один y . Это очень полезная функция, но не для того, что вы здесь пытаетесь сделать.

Ответ состоит в том, чтобы отделить построение от инициализации; конструктор настраивает центральные ресурсы, а инициализатор инициализирует экземпляр. Вот как эта проблема решается в большинстве реализаций «классов», которые я видел для JavaScript. Чтобы это сработало, вы должны предоставить каждому уровню иерархии средство для вызова предыдущего уровня ' s инициализатор (который также полезен для других методов) - например, супервызовы.

Супервызовы - вот почему вам, вероятно, лучше использовать для этого что-то вроде Prototype: их сложно сделать хорошо, и это очень легко попасть в проблему «внуков» - решение, которое кажется работающим, но в итоге работает только со структурой Parent <-Child, а не со структурой Parent <-Child <-GrandChild.

Однако , если вы собираетесь создать свой собственный механизм наследования, этот пост о супервызовах из моего патетически анемичного блога может быть полезен, поскольку я углублюсь в некоторые из этих проблем. Он берет упрощенную версию механизма наследования Prototype, немного ее деконструирует и рассказывает о способе выполнения супервызовов, который не имеет некоторых проблем, которые у меня есть с текущими супервызовами Prototype.

7
ответ дан 5 December 2019 в 19:01
поделиться
B.prototype = new A();

это создает только один экземпляр A для каждого B.

Вы можете подумать о том, чтобы сделать что-то вроде

B = function()
{
  this.$super = new A();
}


B.prototype.doStuff = function()
{
  return this.$super(args);
}


C = function ()
{
  this.$super = new B();
}


C.prototype.doStuff = function()
{
  return this.$super(args);
}

C.prototype.whoIsMyGrandParent = function()
{
  return this.$super.$super;
}

Javascript НЕ имеет реального наследования

2
ответ дан 5 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: