Предотвращение бесконечной рекурсии при использовании прототипного наследования в стиле Backbone

Я использую функцию расширения, адаптированную из Backbone (идентичную, за исключением нескольких изменений, чтобы соответствовать соглашениям об именах моего работодателя) для реализации прототипного наследования. После настройки следующей структуры (значительно упрощенной ниже) я получаю бесконечный цикл.

Graph = function () {};
Graph.extend = myExtendFunction;
Graph.prototype = {
   generateScale: function () {
       //do stuff
   }
}
 // base class defined elsewhere
UsageGraph = Graph.extend({
   generateScale: function () {
       this.constructor._super.generateScale.call(this); // run the parent's method
       //do additional stuff
   }
})

ExcessiveUsageGraph = Graph.extend({
   // some methods, not including generateScale, which is inherited directly from Usage Graph
})

var EUG = new ExcessiveUsageGraph();
EUG.generateScale(); // infinite loop

Цикл возникает из-за того, что ExcessiveUsageGraphподнимается по цепочке прототипов к UsageGraphдля запуска метода, но thisпо-прежнему установлен на экземпляр ExcessiveUsageGraph, поэтому, когда я использую this.constructor._superдля запуска родительского метода, он также поднимается на один шаг по цепочке к UsageGraphи снова вызывает тот же метод.

Как я могу ссылаться на родительские методы из прототипа в стиле Backbone и избежать такого рода циклов. Я также хочу по возможности избегать обращения к родительским классам по имени.

редактироватьВот скрипка, демонстрирующая, что это происходит в Backbone

6
задан wheresrhys 4 April 2012 в 10:39
поделиться