19

我正在使用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

我错过了什么?

4

2 回答 2

39

以下是如何实现您正在寻找的东西:

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

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

这确保了上下文是我想的而不是this实例。BB.super_.prototype

于 2013-02-22T00:08:07.097 回答
0

我更喜欢调用 super through 的方法,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 chainconstructor.super_.prototype.constructor chain

因为通常我将方法隐藏protectedprivate单独的文件中和prototype文件夹下。只有public方法constructorsame scope. 此外,为了让他们在不同的班级之间轻松移动。它们都被命名为prototype.method = function() {...},因此它们中的大多数只能访问原型对象。

或者知道任何好处会很感激constructor chain?这就是我找到这篇文章的原因。

于 2017-05-16T04:39:37.913 回答