прототип наследования javascript

Исходя из фона Java, Javascript — это новый мир, который я пытаюсь понять.
Я как бы борюсь с тем, как именно работает прототипное наследование.
Что я получил от __proto__ VS. прототип в JavaScript и других источниках был полезен, но я действительно хочу убедиться, что понимаю эту тему. Верны ли следующие утверждения?

__proto__, свойство объектов, представляет собой объект, представляющий прототип объекта. Этот объект, в свою очередь, также может иметь свойство __proto__, пока не будет достигнут объект Object, конец цепочки.

prototypeявляется свойством функционального объекта и самим объектом. Когда объект создается из функции с использованием ключевого слова new, __proto__ этого нового экземпляра будет свойством prototype функции-конструктора. Например:

let random =  new Array();

console.log(random.__proto__);   //logs the object which is the prototype of random
console.log(Array.prototype);    //logs the same object as random.__proto__

console.log(random.__proto__.__proto__);  // logs the Object prototype object
console.log(Object.prototype);        // logs the same object as random.__proto__.__proto__

Также, когда объекты проверяются друг с другом на равенство, они являются одним и тем же объектом в следующем коде:

console.log(random.__proto__ === Array.prototype);               // logs true
console.log(random.__proto__.__proto__ === Object.prototype );   // logs true

Поскольку объекты проверяются на равенство по ссылке, означает ли это, что на самом деле существует один экземпляр объекта Object.prototype и что все объекты __proto__ ссылаются на этот экземпляр?

Заранее спасибо.


person Willem van der Veen    schedule 12.09.2017    source источник
comment
Да, все объекты, созданные из одной функции-конструктора, имеют общий объект-прототип. Это перестает быть правдой, если прототип изменяется после создания некоторых объектов: старые объекты будут продолжать ссылаться на старый прототип. Это было бы странно и, конечно, плохо.   -  person Pointy    schedule 13.09.2017
comment
да, да и еще раз))   -  person georg    schedule 13.09.2017
comment
да. Вы правы, с одной маленькой поправкой. до объекта Object достигается конец цепочки. На самом деле Object.prototype — это конец строки.   -  person Scott Marcus    schedule 13.09.2017
comment
Хорошо, большое спасибо!   -  person Willem van der Veen    schedule 13.09.2017
comment
Придирка: концом цепочки прототипов может быть любой объект, Object — самый обычный. Настоящим концом цепочки является нулевое значение.   -  person Tamas Hegedus    schedule 13.09.2017
comment
Другое дело, что среда выполнения не позволяет создавать циклические цепочки прототипов даже с использованием прокси-объектов.   -  person Patrick Roberts    schedule 13.09.2017


Ответы (1)


Если вы используете console.log(typeof(Ojbect)) и console.log(typeof(Array)) у вас есть "функция" Все, что не является примитивным типом (undefined, null...), является объектом или "экземпляром " в JavaScript означает, что функции наследуются от объекта.

person Community    schedule 12.09.2017