Если Вам нравится, как работы haml с точки зрения кодирования, не волнуйтесь о производительности механизма шаблонной обработки слишком много. (Хотя, как Вы указали, это теперь быстро.) Это может определенно генерировать любой вывод, другие механизмы могут.
Обычно является более прибыльным поместить Вашу энергию в установку кэширования, чем волнение по поводу Вашего механизма шаблонной обработки, где у Вас есть проблемы производительности.
Проблема в том, что ваша функция конструктора A
запускается только один раз для всех экземпляров B
, поэтому this.y
ссылка только на один массив. Любая ссылка на него из B
будет разрешена через цепочку прототипов к единственной центральной ссылке A
, которая имеет только один y
. Это очень полезная функция, но не для того, что вы здесь пытаетесь сделать.
Ответ состоит в том, чтобы отделить построение от инициализации; конструктор настраивает центральные ресурсы, а инициализатор инициализирует экземпляр. Вот как эта проблема решается в большинстве реализаций «классов», которые я видел для JavaScript. Чтобы это сработало, вы должны предоставить каждому уровню иерархии средство для вызова предыдущего уровня ' s инициализатор (который также полезен для других методов) - например, супервызовы.
Супервызовы - вот почему вам, вероятно, лучше использовать для этого что-то вроде Prototype: их сложно сделать хорошо, и это очень легко попасть в проблему «внуков» - решение, которое кажется работающим, но в итоге работает только со структурой Parent <-Child, а не со структурой Parent <-Child <-GrandChild.
Однако , если вы собираетесь создать свой собственный механизм наследования, этот пост о супервызовах из моего патетически анемичного блога может быть полезен, поскольку я углублюсь в некоторые из этих проблем. Он берет упрощенную версию механизма наследования Prototype, немного ее деконструирует и рассказывает о способе выполнения супервызовов, который не имеет некоторых проблем, которые у меня есть с текущими супервызовами Prototype.
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 НЕ имеет реального наследования