【发布时间】:2016-09-19 01:08:47
【问题描述】:
假设我们有一个超类Character 和两个子类Player 和Enemy。
var Character = function(x, y){
this.x = x || 0;
this.y = y || 0;
};
var Enemy = function() {
// randomInt returns an integer value in between 0 and 505 (canvas width)
var x = randomInt(0, 505);
var y = this.getNewRow();
Character.call(this, x, y);
};
var Player = function(x, y, hearts) {
Character.call(this, x, y);
this.hearts = hearts;
};
Player 和 Enemy 都将具有原型属性,例如 width、height、leftMargin 和 topMargin。
Enemy.prototype.width = 96;
Enemy.prototype.height = 65;
Enemy.prototype.leftMargin = 2;
Enemy.prototype.topMargin = 78;
Player.prototype.width = 66;
Player.prototype.height = 75;
Player.prototype.leftMargin = 18;
Player.prototype.topMargin = 64;
由于 Player 和 Enemy 两个子类都有这 4 个属性(尽管值不同),我觉得这应该以某种方式重构,但是如何重构呢?由于这些类的每个实例都将具有相同的属性值,因此我确实想利用原型链并将它们保存在原型对象中(除非您可以向我解释为什么我不应该这样做)。
【问题讨论】:
-
如果
Player和Enemy共有这些属性,为什么不将它们添加到Character类中? -
到目前为止,没有超类也没有子类,它们没有关系......
-
@Barmar,因为如果您只是将它们添加到
Character类中,那么每个player和enemy实例都会将这些属性保存为本地值(这会占用内存)和我们不会利用原型链的力量 -
您是说这些值对于所有
Enemies都相同吗?因此,您需要一种方法来表明Character的每个子类都具有这些类范围的属性,但它们是特定于子类的。 -
一个简单的选项是
function setSize(obj, w, h, l, t) { obj.prototype.width = w; /*etc*/ },然后是setSize(Enemy, 96, 65, 2, 78); setSize(Player, 66, 75, 18, 64);。
标签: javascript design-patterns prototype-chain prototype-pattern