使用相同的原型属性重构对象

时间:2016-09-19 01:08:47

标签: javascript design-patterns prototype-chain prototype-pattern

假设我们有一个超类Character和两个子类PlayerEnemy

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;
};

PlayerEnemy都有原型属性,例如widthheightleftMargintopMargin

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; 

由于子类PlayerEnemy都有这4个属性(尽管有不同的值),我觉得这应该以某种方式重构,但是如何?由于这些类的每个实例都具有相同的属性值,我确实想利用原型链并将它们保存在原型对象中(除非你能解释为什么我不应该这样做)。

2 个答案:

答案 0 :(得分:1)

我不会做出这样的区分,完全依赖继承。 我更喜欢组合而不是继承,所以当变化到来时我不会被锁在继承盒中。在这种情况下还要考虑过早的过度工程,你真的期望通过将这些属性存储在对象本身中来解决性能问题吗? 我的设计将是你有一个角色,其中包括x,y,心脏,宽度,高度,leftMargin,topMargin,类型属性。因此,通过这种方式,您可以获得非常灵活的一致数据,以满足您未来的需求:

  • 敌人可以通过更改类型
  • 来交给朋友
  • 敌人也可以在某个时间点拥有心灵,为什么他们不应该?
  • 所有角色都可以通过改变宽度/高度来增长/缩小
  • 所有角色都可以通过更改保证金来改变位置。

基本上,您将拥有一个通用数据结构来进行操作,而不需要拔出头发来维护您的层次结构模型。 希望这会对你有所帮助。

答案 1 :(得分:0)

这里没有特殊的设计模式。将这些属性放在相应的原型上很好,您甚至可能希望在Character.prototype上放置一些默认值。由于它们是应该由类的所有对象共享的实例的属性,因此原型正是放置它们的正确位置。

如果您想在分配时避免重复,只需将其放入函数中即可。