重构具有相同原型属性的对象
Refactoring objects with the same prototype properties
假设我们有一个超类 Character
和 2 个子类 类 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;
因为 sub类 Player
和 Enemy
都有这 4 个属性(尽管值不同),我觉得应该以某种方式重构它,但是如何重构呢?由于这些 类 的每个实例都将具有相同的 属性 值,我确实想利用原型链并将它们保存在原型对象中(除非你能向我解释为什么我不应该这样做).
我不会做出这样的区分并且完全依赖继承。
我更喜欢组合而不是继承,所以当发生变化时我不会被锁定在我的继承盒子里。在这种情况下还要考虑过早的过度工程,您真的会通过将这些属性存储在对象本身中来预期性能问题吗?
我的设计是您有一个字符,它具有 x、y、hearts、width、height、leftMargin、topMargin、type 属性。因此,通过这种方式,您可以获得非常灵活的一致数据,可以满足您未来的需求:
- 敌人可以通过改变类型来交朋友
- 敌人在某个时间点也可以有心,为什么不呢?
- 所有角色都可以 grow/shrink 通过更改 width/height
- 所有角色都可以通过改变边距来改变位置。
基本上,您将拥有一个通用的数据结构来进行操作,而无需费力维护您的层次结构模型。
希望对您有所帮助。
这里没有特别的设计模式可以应用。将这些属性放在各自的原型上很好,您甚至可能想在 Character.prototype
上放置一些默认值。由于它们是应由 class 的所有对象共享的实例的属性,因此原型正是放置它们的正确位置。
如果你想在分配它们时避免重复,只需将其放在函数中即可。
假设我们有一个超类 Character
和 2 个子类 类 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;
因为 sub类 Player
和 Enemy
都有这 4 个属性(尽管值不同),我觉得应该以某种方式重构它,但是如何重构呢?由于这些 类 的每个实例都将具有相同的 属性 值,我确实想利用原型链并将它们保存在原型对象中(除非你能向我解释为什么我不应该这样做).
我不会做出这样的区分并且完全依赖继承。 我更喜欢组合而不是继承,所以当发生变化时我不会被锁定在我的继承盒子里。在这种情况下还要考虑过早的过度工程,您真的会通过将这些属性存储在对象本身中来预期性能问题吗? 我的设计是您有一个字符,它具有 x、y、hearts、width、height、leftMargin、topMargin、type 属性。因此,通过这种方式,您可以获得非常灵活的一致数据,可以满足您未来的需求:
- 敌人可以通过改变类型来交朋友
- 敌人在某个时间点也可以有心,为什么不呢?
- 所有角色都可以 grow/shrink 通过更改 width/height
- 所有角色都可以通过改变边距来改变位置。
基本上,您将拥有一个通用的数据结构来进行操作,而无需费力维护您的层次结构模型。 希望对您有所帮助。
这里没有特别的设计模式可以应用。将这些属性放在各自的原型上很好,您甚至可能想在 Character.prototype
上放置一些默认值。由于它们是应由 class 的所有对象共享的实例的属性,因此原型正是放置它们的正确位置。
如果你想在分配它们时避免重复,只需将其放在函数中即可。