Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
У объекта может быть другой объект, называемый прототипом, которому делегируется обращение к полю в случае неудачи. Deo 25.08.14 в 13:28 |
|
|
Для дизайнера языка, одной из привлекательнейших черт прототипов является то, что их проще реализовать чем классы. Deo 25.08.14 в 13:59 |
||
|
Айк воспользовался этим в полной мере: первая версия JavaScript была создана за 10 дней. Deo 25.08.14 в 13:59 |
||
|
Несмотря на это, я полагаю на практике у JavaScript больше общего с языками, основанными на классах, чем с прототипированными. Deo 25.08.14 в 14:02 |
||
|
Одно из улучшений в JavaScript по сравнению с Self - то, что ключевая для прототипированных языков операция - клонирование, скрыта. Deo 25.08.14 в 21:43 |
||
|
В JavaScript нет метода для клонирования объекта. Deo 25.08.14 в 21:44 |
||
|
Самое похожее в нем - это Object, Deo 25.08.14 в 21:45 |
||
|
создавая который вы создаете новый объект с делегатом на уже существующий. Deo 25.08.14 в 21:47 |
||
|
Хотя это было добавлено лишь со спецификацией ECMAScript 5, 14 лет спустя с момента появления JavaScript. Deo 25.08.14 в 14:03 |
||
|
Вместо клонирования, давайте пройдемся по стандартному пути определения типа и создания объектов в JavaScript. Deo 25.08.14 в 21:51 |
||
|
Начинайте с функции-конструктора: Deo 25.08.14 в 14:04 |
||
|
function Weapon(range, damage) GromHoll 11.10.14 в 18:28 |
||
|
{ GromHoll 11.10.14 в 18:28 |
||
|
this. GromHoll 11.10.14 в 18:29 |
||
|
range = range; GromHoll 11.10.14 в 18:29 |
||
|
this. GromHoll 11.10.14 в 18:29 |
||
|
damage = damage; GromHoll 11.10.14 в 18:29 |
||
|
} GromHoll 11.10.14 в 18:29 |
||
|
Она создает новый объект и инициализирует его поля. Deo 25.08.14 в 14:05 |
||
|
Вызывается она так: Deo 25.08.14 в 14:05 |
||
|
var sword = new Weapon(10, 16); GromHoll 11.10.14 в 18:29 |
||
|
Здесь new вызывает тело функции Weapon, в рамках которого this указывает на новый пустой объект. Deo 25.08.14 в 14:06 |
||
|
В теле функции к этому объекту добавляется несколько полей, затем только что созданный и заполненный объект автоматически возвращается. Deo 25.08.14 в 14:08 |
||
|
Кроме того, new делает для вас еще пару вещей. Deo 25.08.14 в 14:10 |
||
|
Когда new создает новый пустой объект, она связывает его делегат с объектом-прототипом. Deo 25.08.14 в 14:13 |
||
|
Можно получить этот объект напрямую, используя прототип Weapon. Deo 25.08.14 в 14:14 |
+1 | |
|
- GromHoll 11.10.14 в 18:30 |
||
|
В то время как состояние добавляется в теле конструктора, для определения поведения обычно методы добавляют в прототип. Deo 25.08.14 в 14:34 |
||
|
Примерно так: Deo 25.08.14 в 14:34 |
||
|
Weapon. GromHoll 11.10.14 в 18:30 |
||
|
prototype. GromHoll 11.10.14 в 18:30 |
||
|
attack = function(target) GromHoll 11.10.14 в 18:30 |
||
|
{ GromHoll 11.10.14 в 18:30 |
||
|
if (distanceTo(target) GromHoll 11.10.14 в 18:31 |
||
|
> this. GromHoll 11.10.14 в 18:31 |
||
|
range) GromHoll 11.10.14 в 18:31 |
||
|
{ GromHoll 11.10.14 в 18:31 |
||
|
console. GromHoll 11.10.14 в 18:31 |
||
|
og("Out of range!" GromHoll 11.10.14 в 18:31 |
||
|
); GromHoll 11.10.14 в 18:31 |
||
|
} else { GromHoll 11.10.14 в 18:31 |
||
|
target. GromHoll 11.10.14 в 18:31 |
||
|
health -= this. GromHoll 11.10.14 в 18:31 |
||
|
damage; GromHoll 11.10.14 в 18:31 |
||
|
} GromHoll 11.10.14 в 18:31 |
||
|
} GromHoll 11.10.14 в 18:31 |
||
|
Это добавит в прототип оружия свойство attack, значение свойства - это функция. Deo 25.08.14 в 14:36 |
||
|
Так как каждый объект, возвращаемый конструкцией new Weapon(), делегирует прототипу Weapon, Deo 25.08.14 в 14:54 |
||
|
теперь можно вызвать sword. Deo 25.08.14 в 14:55 |
||
|
attack() и прототип вызовет эту функцию. Deo 25.08.14 в 14:55 |
