Наследование node.js предпочитает дочерние свойства конструктора
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 ответ
Я вижу два хороших решения этого. Во-первых, родительский конструктор может принимать параметры для 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
не нужно знать, как правильно их построить. Это также позволяет вам иметь несколько разных "конструкторов" подписей без болезненного анализа аргументов.