Понимание (недоразумение?) Классов на основе прототипов в JavaScript - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь понять, как работает система классов прототипов в JS.Пока что я немного озадачен результатами, которые я получил после создания и отображения объектов (в Firefox).Когда я создаю объект, используя «Пример 1», я получаю объект, у прототипа которого есть одно свойство (функция речи), и у которого есть свойство экземпляра «тип».И это поведение понятно.Но во втором примере, используя ключевое слово 'new', я получил объект со свойством экземпляра 'type' и прототип, у которого есть сам конструктор (Rabbit) и определенная функция 'speak'.И эта функция «говорить» имеет непустое свойство «прототип», и это отношение идет дальше и т. Д. То же самое с конструктором прототипа.Его конструктор имеет свойство «prototype», содержащее то же содержимое, что и предыдущий уровень и т. Д.И это поведение кажется бесконечным деревом рекурсии.Я не понимаю, является ли такое поведение обычным языком "фича"?

// Example 1
let protoRabbit = {
    speak(line) {
    console.log(`The ${this.type} rabbit says '${line}'`);
    }
};
function makeRabbit(type) {
    let rabbit = Object.create(protoRabbit);
    rabbit.type = type;
    return rabbit;
}
// Example 2
function Rabbit(type) {
    this.type = type;
}
Rabbit.prototype.speak = function(line) {
    console.log(`The ${this.type} rabbit says '${line}'`);
};
let weirdRabbit = new Rabbit("weird");
console.log(weirdRabbit);

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Прототип конструктора неявно возвращается к самому себе, так что другие дочерние элементы имеют доступ к родителю через объект «[[prototype]]». Мы можем использовать свойство constructor для создания нового объекта, используя тот же конструктор, что и существующий.

Подробные сведения об этом можно найти на сайте ниже.

https://javascript.info/function-prototype

1 голос
/ 24 апреля 2019

Это на самом деле не «бесконечно», даже если кажется, что это так.Конструктор прототипа объекта (Rabbit) ссылается на себя, поэтому, углубляясь, вы просто открываете один и тот же (Rabbit) объект снова и снова.

...