我正在玩util.inherits
method from 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
我错过了什么?
答案 0 :(得分:38)
以下是如何实现您的目标:
B.prototype.log = function () {
B.super_.prototype.log.apply(this);
console.log('my new name is: ' + this.name);
};
这可以确保this
上下文是B
的实例,而不是我想的B.super_.prototype
。
答案 1 :(得分:0)
我更喜欢通过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
的{{1}}更好。
因为我通常会将constructor chain
,protected
方法隐藏在单独的文件中以及private
文件夹下。只有prototype
方法与public
中的constructor
函数一起使用。另外,为了让它们易于在不同的班级中移动。所有这些都被命名为same scope
,因此大多数都只能访问原型对象。
或者,我们希望了解prototype.method = function() {...}
的任何好处?这就是我找到这篇文章的原因。