Я использую функцию расширения, адаптированную из 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