node.js继承更喜欢子构造函数属性

时间:2014-10-26 20:12:16

标签: node.js inheritance prototypal-inheritance

var util = require('util');

function Entity(){
  //this.x == 10 at this point
  this.x = 0;
  this.y = 0;
  this.globalInit();
}

Entity.prototyp.globalInit = function(){
  console.log("this.x ", x);
};

function Actor(){
  this.x = 10;
  this.y = 10;
  Actor.super_.apply(this, arguments);
}

util.inherits(Entity, Actor);
var a = new Actor();
//outputs -> this.x 0

我有这两个构造函数。我希望子构造函数中定义的属性是最终属性。我可以将Actor.super_.apply移到构造函数的顶部,但是我想保留在父构造函数末尾的初始化逻辑(globalInit

1 个答案:

答案 0 :(得分:1)

我可以看到两个很好的解决方案。首先,父构造函数可以接受xy的参数,并将它们默认为父类值。

function Entity(x, y){
  this.x = typeof x === 'undefined' ? 0 : x;
  this.y = typeof y === 'undefined' ? 0 : y;
  this.globalInit();
}

function Actor(){
  Actor.super_.call(this, 10, 10);
}

如果没有很多属性,并且允许传入它们不成问题,这种方法最有效。如果初始化非常复杂,它会有所分解。

在初始化非常复杂的情况下,第二种方法更为通用。实质上,您希望引入工厂方法来生成对象的实例,然后可以执行任意复杂的初始化。例如,

function Entity(){}
function Actor(){}

function createEntity(){
  var e = new Entity();
  e.x = 0;
  e.y = 0;
  e.globalInit();
  return e;
}

function createActor(){
  var a = new Actor();
  a.x = 10;
  a.y = 10;
  a.globalInit();
  return a;
}

显然,这可以进行重构以进一步干掉代码,可能是第一种解决方案的某些变体。

使用工厂方法而不是直接调用构造函数也会以其他方式增加值。它稍微分离了两个模块,因此这些EntitiesActors的使用者不需要知道如何正确构建它们。它还允许您拥有多个不同的"构造函数"没有痛苦的论证分析的签名。