Javascript抽象成员

时间:2011-10-29 21:47:53

标签: javascript oop inheritance

我不确定标题是否准确描述了我在这里要做的事情,但这里是代表问题的代码:

var spriteDefinitions = {};

function Sprite(x, y) {
   this.x = x;
   this.y = y;
}

spriteDefinitions.Player = function(x, y, state) {
   Sprite.call(this, x, y);
   this.state = state;
}

spriteDefinitions.Player.prototype = new Sprite();
spriteDefinitions.Player.prototype.constructor = spriteDefinitions.Player;
spriteDefinitions.Player.prototype.states = new Array();
spriteDefinitions.Player.prototype.states[0] = "state 0";
spriteDefinitions.Player.prototype.states[1] = "state 1";
spriteDefinitions.Player.prototype.statesEnum = {Right: 0,Left: 1};

var player1 = new spriteDefinitions.Player(50, 90, spriteDefinitions.Player.statesEnum.Left);
var player2 = new spriteDefinitions.Player(100, 100, spriteDefinitions.Player.statesEnum.Right);

由于Player.statesEnum未定义,因此创建player1会收到错误。 Player应该是一个继承自Sprite的类。而Sprite应该能够访问所有派生类(抽象成员)的状态。但派生类实际上定义了状态。如何正确使statesEnum适用于所有Player实例?我假设我将与所有Player.prototype成员有同样的问题。在普通的OO语言中,我认为这些是抽象成员,但我不清楚如何使用JavaScript。

1 个答案:

答案 0 :(得分:2)

您似乎希望stateEnum在构造函数上可用,而不是在实例上。使用原型,您可以定义属性实例继承的内容。

但是,如果您希望spriteDefinitions.Player.statesEnum可用,请将其定义为:

spriteDefinitions.Player.statesEnum = {Right: 0,Left: 1};

函数是可以同时获取属性的对象。请注意,这不会使实例有statusEnum可用;为此你可以使用原型。