Наследование в JS. Как вызвать метод родителя по цепочке наследования? Имеется своя реализация системы создания и наследования "классов". Имеется возможность наследования в виде:childClass.prototype = Object.create( parentClass.prototype ); childClass.prototype.constructor = childClass; // Копируем методы родителя с добавлением префикса, или в спец. список // Прописываем сверху методы наследника childClass.prototype.parent = parentClass; childClass.prototype.parentMethodList = parentMethodList; childClass.prototype.childMethodList = childMethodList; childClass.prototype.inheritedMethodList = inheritedMethodList; Реализовываю наследование: Class1 -> Class2 -> Class3. При инициализации Class3 произвожу инициализацию Class2, а тот в свою очередь Class1.... constructor: function() { ... this.parent(); ... } Но проблема в том, что в момент инициализации Class2, область видимости this остаётся на Class3, потому последующий вызов this.parent вызываем опять инициализацию Class2 вместо Class1 (выходит просто постоянная инициализация Class2 в рекурсии). Пытался реализовать что-то вида: childClass.prototype.parent = function( ) { new parentClass.apply( parentClass, arguments ); }; Но это всё не то. Как выйти из данной ситуации? Спасибо. Листинг версии которую ковыряю: pastebin.com/iirPtLUJ
Для вызова метода родителя по цепочке наследования в JavaScript можно воспользоваться методом call или apply. В вашем случае, чтобы правильно вызвать метод родителя во время инициализации Class2 из Class3, можно передать контекст вызова метода родителя явно, указав this как первый аргумент метода call или apply:
Таким образом, в момент вызова метода parent из Class2 из контекста Class3, this будет указывать на текущий экземпляр Class2, а не на Class3, и рекурсивной инициализации не произойдет.
Надеюсь, это поможет вам решить проблему с вызовом методов родителей по цепочке наследования в вашей реализации системы классов.
Для вызова метода родителя по цепочке наследования в JavaScript можно воспользоваться методом call или apply.
constructor: function()В вашем случае, чтобы правильно вызвать метод родителя во время инициализации Class2 из Class3, можно передать контекст вызова метода родителя явно, указав this как первый аргумент метода call или apply:
{
...
this.parent.call(this);
...
}
Таким образом, в момент вызова метода parent из Class2 из контекста Class3, this будет указывать на текущий экземпляр Class2, а не на Class3, и рекурсивной инициализации не произойдет.
Надеюсь, это поможет вам решить проблему с вызовом методов родителей по цепочке наследования в вашей реализации системы классов.