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
)
答案 0 :(得分:1)
我可以看到两个很好的解决方案。首先,父构造函数可以接受x
和y
的参数,并将它们默认为父类值。
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;
}
显然,这可以进行重构以进一步干掉代码,可能是第一种解决方案的某些变体。
使用工厂方法而不是直接调用构造函数也会以其他方式增加值。它稍微分离了两个模块,因此这些Entities
和Actors
的使用者不需要知道如何正确构建它们。它还允许您拥有多个不同的"构造函数"没有痛苦的论证分析的签名。