Задать вопрос
@ange007
Программист, просто программист.

Наследование в 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
  • Вопрос задан
  • 1425 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
mlnkv
@mlnkv
JavaScript Developer
Почему не воспользоваться готовой реализацией? Например, Backbone
function Class() {}

// Helper function to correctly set up the prototype chain for subclasses.
// Similar to `goog.inherits`, but uses a hash of prototype properties and
// class properties to be extended.
Class.extend = function(protoProps, staticProps) {
  var parent = this, child, prop;

  // The constructor function for the new subclass is either defined by you
  // (the "constructor" property in your `extend` definition), or defaulted
  // by us to simply call the parent constructor.
  if (protoProps && protoProps.hasOwnProperty('constructor')) {
    child = protoProps.constructor;
  } else {
    child = function() { return parent.apply(this, arguments); };
  }

  // Add static properties to the constructor function, if supplied.  
  for (prop in parent) child[prop] = parent[prop];
  for (prop in staticProps) child[prop] = staticProps[prop];

  // Set the prototype chain to inherit from `parent`, without calling
  // `parent` constructor function.
  var Surrogate = function() { this.constructor = child; };
  Surrogate.prototype = parent.prototype;
  child.prototype = new Surrogate;

  // Add prototype properties (instance properties) to the subclass,
  // if supplied.
  for (prop in protoProps) child.prototype[prop] = protoProps[prop];

  // Save parent prototype
  child.prototype.__super__ = parent.prototype;

  return child;
};

var Model = Class.extend({
  constructor: function() {
    console.log("Model:constructor()");
  }
});

var User = Model.extend({
  constructor: function() {
    this.__super__.constructor();
    console.log("User:constructor()");
  }
});

var SuperUser = User.extend({
  constructor: function() {
    this.__super__.constructor();
    console.log("SuperUser:constructor()");
  }
});

var supeUser = new SuperUser();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы