0

Предположим, у нас есть суперкласс 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; 

Так как подклассы Player и Enemy имеют эти 4 свойства (с разными значениями, тем не менее), я чувствую, как это должно быть переработано так или иначе, но как? Поскольку каждый экземпляр этих классов будет иметь одинаковые значения свойств, я хочу использовать цепочку прототипов и держать их в объекте прототипа (если вы не можете объяснить мне, почему я не должен этого делать).

+0

Если эти свойства являются общими для «Player» и «Enemy», почему бы вам не добавить их в класс «Символ»? – Barmar

+0

К настоящему времени нет суперклассов и подклассов, они не связаны ... – passion

+0

@Barmar, потому что, если вы просто добавите их в класс 'Character', тогда каждый экземпляр' player' и 'enemy' будет хранить эти свойства как локальные значения (и это заняло бы память), и мы не будем использовать мощность прототипных цепей. – sjbuysse

ответ

0

Здесь нет специального шаблона дизайна. Помещение этих свойств на соответствующие прототипы прекрасное, вы можете даже захотеть поместить некоторые значения по умолчанию на Character.prototype. Поскольку они являются свойствами для экземпляров, которые должны быть разделены всеми объектами класса, прототип является именно тем местом, где их можно разместить.

Если вы хотите избежать повторения при назначении их, просто поместите это в функцию.

1

Я бы не делал таких различий и вообще не полагался на наследование. Я бы предпочел композицию над наследованием, поэтому я не заблокирован в своей коробке наследования при изменении. Также рассмотрите преждевременное переоснащение в этом случае, действительно ли вы ожидаете проблем с производительностью, сохраняя эти свойства в самом объекте? Мой дизайн будет заключаться в том, что у вас есть персонаж, который либо с x, y, сердцами, шириной, высотой, leftMargin, topMargin, свойствами типа. Так что в этом случае у вас есть очень гибкие непротиворечивые данные, которые будут соответствовать вашим будущим требованиям:

  • Врагов могут превратиться в друзьях по смене типа
  • Врагов могут также иметь сердца на определенный момент времени, поэтому они не должны ?
  • все Персонажи могут расти/уменьшаться, изменяя ширину/высоту
  • все Персонажи могут менять положение, изменяя поле.

В принципе, у вас будет универсальная структура данных, с которой можно манипулировать, не вытаскивая волосы, чтобы поддерживать вашу иерархическую модель. Надеюсь, это вам поможет.

+0

Отличный совет и перспектива, я рассмотрю состав (я никогда не слышал об этом). Причина, по которой я «перерабатываю» это, заключается в том, что это учебный проект, и меня действительно интересуют шаблоны дизайна. – sjbuysse