Как пример прототипа Yegge обрабатывает переменные экземпляра?

StackOverflow https://stackoverflow.com/questions/228134

Вопрос

Мне нравится пример шаблона прототипа Стива Йегге и решил быстро привести пример концепции.

Тем не менее, я действительно не продумывал вещи. Хотя он отлично подходит для динамического определения поведения объектов и является простым решением для самоуверенного эльфа, Стив Например, я все еще пытаюсь найти лучший способ обработки переменных экземпляра.

Например, допустим, у меня есть объект AwesomeDragon. Затем я хочу создать объект AwesomeDragonImmuneToFire, чтобы создать нового потомка AwesomeDragon (AwesomeDragonImmuneToFire наследует свойства от AwesomeDragon) и «положить» & ImmuneToFire " как свойство со значением «истина». Все идет нормально. Теперь предположим, что я хочу отправить свой объект AwesomeDragon на экскурсию по соседним крестьянским деревням. Это будет включать обновление свойства 'position' AwesomeDragon. Однако в тот момент, когда я это сделаю, AwesomeDragonImmuneToFire также сработает.

Лучшее решение для переопределения значений экземпляра при создании объекта, например немедленно «поместить» значение «position» на AwesomeDragonImmuneToFire в текущее значение «get» для «position»?

Это было полезно?

Решение

Разве это не зависит от того, как вы на самом деле реализуете наследование в своей системе?

Например, в версии JavaScript, которую вы описываете, прототип для AwesomeDragonImmuneToFire обычно является экземпляром AwesomeDragon , и поскольку вы всегда будете работать с экземплярами, не имеет значения, что вы делаете с каким-либо конкретным AwesomeDragon :

function Dragon()
{
    this.position = "starting point";
}

function AwesomeDragon()
{
    this.awesome = true;
}
AwesomeDragon.prototype = new Dragon();

function AwesomeDragonImmuneToFire()
{
    this.immuneToFire = true;
}
AwesomeDragonImmuneToFire.prototype = new AwesomeDragon();

>>> var awesome = new AwesomeDragon();
>>> var immune = new AwesomeDragonImmuneToFire();
>>> awesome.position = "flying above village";
>>> immune.position;
"starting point"
>>> immune.awesome
true

В этом примере нет классов, и все экземпляры являются просто экземплярами Object , которые знают, какая функция использовалась для их создания. new - это всего лишь немного синтаксического сахара и использование StudlyCaps для функций конструктора это просто соглашение для функций, которые предназначены для использования с new .

Ключевым моментом является то, что каждый объект имеет цепочку объектов-прототипов, которая проверяется, если вы пытаетесь получить доступ к атрибуту, который сам объект не содержит, в соответствии с описанием Йегге того, что " Свойства шаблона " есть.

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Metail_Me / а>

Другие советы

  

Это будет включать обновление свойства 'position' AwesomeDragon. Однако в тот момент, когда я это сделаю, AwesomeDragonImmuneToFire также сработает.

Может быть, я неправильно понимаю, но я не уверен, почему вы думаете, что AwesomeDragonImmuneToFire также взлетит. Если они являются двумя различными объектами, а положение является свойством объектов, то каждый экземпляр (дракон) будет иметь свою собственную позицию. Изменение положения одного дракона не должно влиять на положение другого.

scroll top