Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

У объекта может быть другой объект, называемый прототипом, которому делегируется обращение к полю в случае неудачи.

Deo 25.08.14 в 13:28

0

Для дизайнера языка, одной из привлекательнейших черт прототипов является то, что их проще реализовать чем классы.

Deo 25.08.14 в 13:59

0

Айк воспользовался этим в полной мере: первая версия JavaScript была создана за 10 дней.

Deo 25.08.14 в 13:59

0

Несмотря на это, я полагаю на практике у JavaScript больше общего с языками, основанными на классах, чем с прототипированными.

Deo 25.08.14 в 14:02

0

Одно из улучшений в JavaScript по сравнению с Self - то, что ключевая для прототипированных языков операция - клонирование, скрыта.

Deo 25.08.14 в 21:43

0

В JavaScript нет метода для клонирования объекта.

Deo 25.08.14 в 21:44

0

Самое похожее в нем - это Object,

Deo 25.08.14 в 21:45

0

создавая который вы создаете новый объект с делегатом на уже существующий.

Deo 25.08.14 в 21:47

0

Хотя это было добавлено лишь со спецификацией ECMAScript 5, 14 лет спустя с момента появления JavaScript.

Deo 25.08.14 в 14:03

0

Вместо клонирования, давайте пройдемся по стандартному пути определения типа и создания объектов в JavaScript.

Deo 25.08.14 в 21:51

0

Начинайте с функции-конструктора:

Deo 25.08.14 в 14:04

0

function Weapon(range, damage)

GromHoll 11.10.14 в 18:28

0

{

GromHoll 11.10.14 в 18:28

0

this.

GromHoll 11.10.14 в 18:29

0

range = range;

GromHoll 11.10.14 в 18:29

0

this.

GromHoll 11.10.14 в 18:29

0

damage = damage;

GromHoll 11.10.14 в 18:29

0

}

GromHoll 11.10.14 в 18:29

0

Она создает новый объект и инициализирует его поля.

Deo 25.08.14 в 14:05

0

Вызывается она так:

Deo 25.08.14 в 14:05

0

var sword = new Weapon(10, 16);

GromHoll 11.10.14 в 18:29

0

Здесь new вызывает тело функции Weapon, в рамках которого this указывает на новый пустой объект.

Deo 25.08.14 в 14:06

0

В теле функции к этому объекту добавляется несколько полей, затем только что созданный и заполненный объект автоматически возвращается.

Deo 25.08.14 в 14:08

0

Кроме того, new делает для вас еще пару вещей.

Deo 25.08.14 в 14:10

0

Когда new создает новый пустой объект, она связывает его делегат с объектом-прототипом.

Deo 25.08.14 в 14:13

0

Можно получить этот объект напрямую, используя прототип Weapon.

Deo 25.08.14 в 14:14

0
+1

-

GromHoll 11.10.14 в 18:30

0

В то время как состояние добавляется в теле конструктора, для определения поведения обычно методы добавляют в прототип.

Deo 25.08.14 в 14:34

0

Примерно так:

Deo 25.08.14 в 14:34

0

Weapon.

GromHoll 11.10.14 в 18:30

0

prototype.

GromHoll 11.10.14 в 18:30

0

attack = function(target)

GromHoll 11.10.14 в 18:30

0

{

GromHoll 11.10.14 в 18:30

0

if (distanceTo(target)

GromHoll 11.10.14 в 18:31

0

> this.

GromHoll 11.10.14 в 18:31

0

range)

GromHoll 11.10.14 в 18:31

0

{

GromHoll 11.10.14 в 18:31

0

console.

GromHoll 11.10.14 в 18:31

0

og("Out of range!"

GromHoll 11.10.14 в 18:31

0

);

GromHoll 11.10.14 в 18:31

0

} else {

GromHoll 11.10.14 в 18:31

0

target.

GromHoll 11.10.14 в 18:31

0

health -= this.

GromHoll 11.10.14 в 18:31

0

damage;

GromHoll 11.10.14 в 18:31

0

}

GromHoll 11.10.14 в 18:31

0

}

GromHoll 11.10.14 в 18:31

0

Это добавит в прототип оружия свойство attack, значение свойства - это функция.

Deo 25.08.14 в 14:36

0

Так как каждый объект, возвращаемый конструкцией new Weapon(), делегирует прототипу Weapon,

Deo 25.08.14 в 14:54

0

теперь можно вызвать sword.

Deo 25.08.14 в 14:55

0

attack() и прототип вызовет эту функцию.

Deo 25.08.14 в 14:55

0
Минутку...

← Предыдущая страница

Следующая страница →