重构具有相同原型属性的对象

Refactoring objects with the same prototype properties

假设我们有一个超类 Character 和 2 个子类 类 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; 

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

我不会做出这样的区分并且完全依赖继承。 我更喜欢组合而不是继承,所以当发生变化时我不会被锁定在我的继承盒子里。在这种情况下还要考虑过早的过度工程,您真的会通过将这些属性存储在对象本身中来预期性能问题吗? 我的设计是您有一个字符,它具有 x、y、hearts、width、height、leftMargin、topMargin、type 属性。因此,通过这种方式,您可以获得非常灵活的一致数据,可以满足您未来的需求:

  • 敌人可以通过改变类型来交朋友
  • 敌人在某个时间点也可以有心,为什么不呢?
  • 所有角色都可以 grow/shrink 通过更改 width/height
  • 所有角色都可以通过改变边距来改变位置。

基本上,您将拥有一个通用的数据结构来进行操作,而无需费力维护您的层次结构模型。 希望对您有所帮助。

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

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