假设我们有一个超类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个属性(尽管有不同的值),我觉得这应该以某种方式重构,但是如何?由于这些类的每个实例都具有相同的属性值,我确实想利用原型链并将它们保存在原型对象中(除非你能解释为什么我不应该这样做)。
答案 0 :(得分:1)
我不会做出这样的区分,完全依赖继承。 我更喜欢组合而不是继承,所以当变化到来时我不会被锁在继承盒中。在这种情况下还要考虑过早的过度工程,你真的期望通过将这些属性存储在对象本身中来解决性能问题吗? 我的设计将是你有一个角色,其中包括x,y,心脏,宽度,高度,leftMargin,topMargin,类型属性。因此,通过这种方式,您可以获得非常灵活的一致数据,以满足您未来的需求:
基本上,您将拥有一个通用数据结构来进行操作,而不需要拔出头发来维护您的层次结构模型。 希望这会对你有所帮助。
答案 1 :(得分:0)
这里没有特殊的设计模式。将这些属性放在相应的原型上很好,您甚至可能希望在Character.prototype
上放置一些默认值。由于它们是应该由类的所有对象共享的实例的属性,因此原型正是放置它们的正确位置。
如果您想在分配时避免重复,只需将其放入函数中即可。