Как пример прототипа Yegge обрабатывает переменные экземпляра?
-
03-07-2019 - |
Вопрос
Мне нравится пример шаблона прототипа Стива Йегге и решил быстро привести пример концепции.
Тем не менее, я действительно не продумывал вещи. Хотя он отлично подходит для динамического определения поведения объектов и является простым решением для самоуверенного эльфа, Стив Например, я все еще пытаюсь найти лучший способ обработки переменных экземпляра.
Например, допустим, у меня есть объект 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 также взлетит. Если они являются двумя различными объектами, а положение является свойством объектов, то каждый экземпляр (дракон) будет иметь свою собственную позицию. Изменение положения одного дракона не должно влиять на положение другого.