我一直在努力学习Javascript的继承结构的来龙去脉,我遇到了这个问题。我试图创建几个子类对象,并通过在创建时传递变量来立即为它们赋值。
例如,在父类GamePiece
下面创建一个随机属性作为变量,并将其设置为myProperty
,当然在创建新的GamePiece
对象时工作正常。但是,如果我想在创建Pawn
对象时设置该变量,则它不会传递到其父级并保持未设置状态。显而易见的解决方法是在子类上再次定义变量,但如果我错了,请纠正我,这似乎打败了定义父类的目的。您还可以通过将参数作为Pawn.prototype = new GameObject("foo");
传递来成功设置变量,但在创建多个Pawn()
对象时没有帮助。有没有一种常见的方法可以解决这个问题?
var GamePiece = function (randomProperty) {
this.myProperty = randomProperty || "never set";
this.print = function () {
console.log(this.myProperty);
}
}
var Pawn = function (randomProperty) {
this.print = function () {
console.log(this.myProperty);
}
}
//Setting a value on creation
piece = new GamePiece("foo");
piece.print(); // Produces "foo" naturally
//Setting the prototype
Pawn.prototype = new GamePiece();
//Try to pass value through the creation of subclass
pawn = new Pawn("foo");
pawn.print(); // Produces "never set"

答案 0 :(得分:0)
您必须使用this
或call
方法在当前apply
的上下文中调用您的父类:
var GamePiece = function (randomProperty) {
this.myProperty = randomProperty || "never set";
this.print = function () {
console.log(this.myProperty);
}
}
var Pawn = function (randomProperty) {
Game.call(this, randomProperty);
// or Game.apply(this, [randomProperty]);
}
但是将方法保留在原型中会更好。所以下一个代码会更好:
var GamePiece = function (randomProperty) {
this.myProperty = randomProperty || "never set";
//... some another properties initialization
};
GamePiece.prototype.print = function () {
console.log(this.myProperty);
};
var Pawn = function (randomProperty) {
Game.call(this, randomProperty);
// or Game.apply(this, [randomProperty]);
//... some Pawn properties initialization
};
Pawn.prototype = Object.create(Game.prototype, { constructor: { value: Pawn }});
Pawn.prototype.someMethod = function() {
// Some Pawn method logic
};
但ES6即将到来(将于2015年6月成为recommendation
),因此您可以开始准备使用它们。请参阅here,here和here