Цепочка прототипов: вызов суперметода на нескольких уровнях

У меня есть следующая цепочка прототипов

  • SuperSuperClass
    • SuperClass
      • Class

каждый с методом с именем do.

Каков общий подход к вызову соответствующего метода суперкласса?
На данный момент я использую <ClassName>.prototype.__proto__.<methodName>.call(this), но это выглядит странно.

Используя следующий код, консоль печатает (как и ожидалось):

  • Класс.prototype.do
  • Суперкласс.prototype.do
  • SuperSuperClass.prototype.do
SuperSuperClass = function SuperSuperClass() {}
SuperSuperClass.prototype.do = function() {
    console.log('SuperSuperClass.prototype.do');
};

function SuperClass() {
    SuperSuperClass.call(this);
}
SuperClass.prototype = Object.create(SuperSuperClass.prototype);
SuperClass.prototype.constructor = SuperClass;
SuperClass.prototype.do = function() {
    console.log('SuperClass.prototype.do');
    SuperClass.prototype.__proto__.do.call(this);
};

function Class() {
    SuperClass.call(this);
}
Class.prototype = Object.create(SuperClass.prototype);
Class.prototype.constructor = Class;
Class.prototype.do = function() {
    console.log('Class.prototype.do');
    Class.prototype.__proto__.do.call(this);
};

var objClass = new Class();
objClass.do();

JSFiddle


person Prule    schedule 31.07.2014    source источник


Ответы (1)


Каков общий подход для вызова соответствующего метода суперкласса?

Используйте 1_. Это не только короче, но и позволяет работать в средах, не поддерживающих нестандартное свойство __proto__.

person Bergi    schedule 31.07.2014
comment
Аарг... Я пробовал что-то подобное раньше, но случайно использовал ClassName. Обновленная скрипта: jsfiddle.net/fcaQ9/1 Использование this.constructor.prototype.do.call(this), как указано здесь это не решение, не так ли? - person Prule; 31.07.2014
comment
Нет, это не так - представьте, что ваш Class не перезаписывает SuperClass::do, вы получите бесконечную рекурсию, аналогичную этот пример - person Bergi; 31.07.2014
comment
Спасибо за ссылки. - person Prule; 31.07.2014