Я понимаю, что к любому объекту, созданному в JS, прикреплен скрытый объект-прототип.
По сути, да.Каждый объект имеет внутреннее свойство , обозначенное в спецификации как [[Prototype]]
, значение которого просто (ссылка на) другого объекта. Этот другой объект является прототипом первого объекта.
Однако сам объект-прототип не скрыт, и вы можете явно установить прототип объекта с помощью Object.create
:
var foo = {x: 42};
var bar = Object.create(foo);
console.log(bar.x); // 42
console.log(Object.getPrototypeOf(bar) === foo); // true
В этом примере foo
является прототипом bar
.
Объект-прототип является одновременно свойством родительского объектаи сам объект
Прежде всего, не существует только одного объекта-прототипа.Любой объект может выступать в качестве прототипа, и существует множество различных объектов-прототипов.И когда мы говорим «объект-прототип», мы действительно имеем в виду объект, который имеет «роль» прототипа, а не объект определенного «типа» .Нет заметной разницы между объектом, который является прототипом, и объектом, который не является.
Я не совсем уверен, что вы подразумеваете здесь под "свойством родительского объекта".Объект не является свойством, самое большее это может быть значение свойства .В этом смысле, да, объект, который является прототипом, должен быть значением внутреннего свойства [[Prototype]]
другого объекта.
Но это не сильно отличается от любых других отношений между двумя объектами (так что ничего особенного).В следующем примере bar
является объектом и также присваивается свойству foo
:
var bar = {};
var foo = {bar: bar};
Является ли Object таким же, как объект-прототип?
Object
- это функция (конструктор) для создания объектов.var obj = new Object();
совпадает с var obj = {};
.Однако использование литералов объектов ({...}
) более удобно, поэтому вы не видите, чтобы new Object
использовал так много.
Для каждой функции конструктора C
верно следующее:
Object.getPrototypeOf(new C()) === C.prototype
т.е. значение свойства C.prototype
становится прототипом нового экземпляра C
, созданного с помощью new C
.
Object.prototype
на самом деле является интересной частьюObject
и самый важный.Возможно, вы слышали о «цепи прототипов» .Поскольку прототип - это просто объект, у него есть сам прототип, который является объектом и т. Д. Эта цепочка должна где-то заканчиваться.Object.prototype
- это значение, которое находится в конце практически каждой цепочки прототипов.
Существует много цепочек прототипов, потому что каждое значение, которое не является примитивным значением (Boolean, Number, String, Null, Undefined, Symbol), является объектом(который включает в себя функции, регулярные выражения, массивы, даты и т. д.).
Если нет, что такое Object - глобальный объект?
См. выше.Это не глобальный объект, глобальный объект в браузерах равен window
, и хотя в каждой среде JavaScript должны быть глобальные объекты, по крайней мере, пока в языке нет стандартного способа ссылаться на него ( edit: Я думаю, this
в глобальной среде будет одним кроссплатформенным способом).
Как это / они относятся к объекту окна или глобальному объекту?
Единственное отношение на самом деле таково:
Вы можете подуматьпрототип глобального объекта также Object.prototype
, , но это не обязательно так
Материал для чтения: