util.inherits - 如何在实例上调用super方法?

时间:2013-02-21 23:19:49

标签: node.js inheritance

我正在玩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

我错过了什么?

2 个答案:

答案 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 chainprotected方法隐藏在单独的文件中以及private文件夹下。只有prototype方法与public中的constructor函数一起使用。另外,为了让它们易于在不同的班级中移动。所有这些都被命名为same scope,因此大多数都只能访问原型对象。

或者,我们希望了解prototype.method = function() {...}的任何好处?这就是我找到这篇文章的原因。