Подтвердить что ты не робот

Util.inherits - как вызвать метод super, например?

Я играю с util.inherits методом от node.js и не может показаться желательным.

var util = require("util");

function A() {
  this.name = 'old';
}

A.prototype.log =  function(){
  console.log('my old name is: '+ this.name);
};

function B(){
  A.call(this);
  this.name = 'new';
}

util.inherits(B, A);

B.prototype.log = function(){
  B.super_.prototype.log();
  console.log('my new name is: ' + this.name);
}

var b = new B();
b.log();

Результат:

my old name is: undefined 
my new name is: new

Однако я бы хотел:

my old name is: new 
my new name is: new

Что мне не хватает?

4b9b3361

Ответ 1

Здесь, как добиться того, что вы ищете:

B.prototype.log = function () {
  B.super_.prototype.log.apply(this);

  console.log('my new name is: ' + this.name);
};

Это гарантирует, что контекст this является экземпляром B вместо B.super_.prototype. Я полагаю.

Ответ 2

Я предпочитаю называть метод super через prototype chain вместо constructor chain следующим образом.

var prototype = C.prototype;

prototype.log = function() {
  Object.getPrototypeOf(prototype).log.call(this)

  // or old style
  prototype.__proto__.log.call(this)
}

Все они получают доступ к объекту прототипа суперкласса, но использование prototype chain может быть лучше, чем constructor.super_.prototype constructor chain.

потому что обычно я скрываю методы protected, private в разделенных файлах и в папке prototype. Только public методы имеют функцию constructor в same scope. Кроме того, чтобы они могли легко перемещаться по различным классам. Все они называются prototype.method = function() {...}, поэтому большинство из них могут обращаться к объекту прототипа.

Или было бы полезно знать любую выгоду, чтобы пройти через constructor chain? Вот почему я нашел этот пост.