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
Что мне не хватает?
Ответы
Ответ 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
? Вот почему я нашел этот пост.