Как javascript узнал, что он достиг конца цепочки поиска __proto__

javascript prototype

83 просмотра

1 ответ

Я читаю о прото- цепочке в javascript. Я пытаюсь понять, как javascript узнает, что он достиг конца __proto__цепочки. Который на самом деле будет внутри объекта, на который указывает Object.prototype. До сих пор я понял следующее, пожалуйста, поправьте меня, если я не прав.

Каждая функция конструктор имеет свойство , prototypeи он также имеет свойство __proto__по умолчанию __proto__указывает Object.prototype. Однако, как только экземпляр объекта создан с использованием new, __proto__свойству этого экземпляра присваивается новое значение, которое является ConstructorName.prototype. Теперь во время использования, когда свойство не найдено в локальной области видимости объекта. Javascript просматривает объект, на который указывает объект, __proto__если объект там не найден, затем просматривает объект, на который указывает __proto__объект этого объекта, и процесс продолжается. Мой вопрос теперь , если процесс продолжается, похоже в конце концов , это будет в конечном итоге внутри объекта , на который указывает Object.prototype.ли это , Object.prototypeесть__proto__?? Я заглянул внутрь Chrome, и, похоже, нет, но у него есть геттеры и сеттеры прото, поэтому я не уверен насчет этого. Я хотел бы знать, чем заканчивается этот поиск.

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

Автор: James Franco Источник Размещён: 08.11.2019 11:02

Ответы (1)


2 плюса

Решение

Оба следующих выражения верны:

console.log(Object.prototype.__proto__ === null);
console.log(Object.prototype.constructor === Object);

Это означает, что цепочка прототипов через __proto__заканчивается, когда становится ее значение null.

Тем не менее, конструктор Object.prototypeснова Object, так что это действительно бесконечный цикл. Это, конечно, просто так, как это реализовано и не означает, что Object.prototypeбыло создано new Object().

Объекты без прототипов

Вы также можете создать объект, который не имеет __proto__. Эти два выражения верны:

console.log(Object.create(null).__proto__ === undefined);
console.log(Object.create(null).constructor === undefined);

__proto__: стандартизировано и устарело

Хорошая статья о__proto__ упоминаниях:

Поскольку он __proto__получил широкую поддержку, было решено, что его поведение должно быть стандартизировано для ECMAScript 6. Однако из-за его проблемной природы он был добавлен как устаревшая функция.

 

Object.getPrototypeOf()

Для получения информации о прототипе объекта рекомендуется использовать Object.getPrototypeOf(obj)вместо obj.__proto__:

console.log(Object.getPrototypeOf({}) === Object.prototype);
console.log(Object.getPrototypeOf(Object.prototype) === null);
console.log(Object.getPrototypeOf(Object.create(null)) === null);

Автор: trincot Размещён: 20.08.2016 08:06
Вопросы из категории :
32x32