Объект против прототипа в Javascript - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь понять прототипы и имею дело с некоторым вмешательством из моего понимания различных других конструкций.

Может кто-нибудь объяснить мне, что такое объект в Javascript? Чтобы уточнить, я знаю , что такое объект (с «o» в нижнем регистре), но не то, чем является Object (с «O»). Я понимаю, что к любому объекту, созданному в JS, прикреплен скрытый объект-прототип. Объект-прототип является как свойством родительского объекта, так и самого объекта со своими собственными свойствами, доступ к которым можно получить с помощью следующей команды objectName. prototype ; Кроме того, среди свойств объекта-прототипа находится объект-прототип. Является ли Object таким же, как объект-прототип? Если нет, то что такое Object - глобальный объект? Как это / они относятся к объекту окна или глобальному объекту?

Заранее спасибо за помощь. Я искал в интернете ответ на этот вопрос и не смог найти тот, который был бы доступным или понятным. Хотя мне не 10 лет, если вы любезно объясните мне, как будто я, я не буду обижаться и буду очень благодарен за ваши усилия.

1 Ответ

0 голосов
/ 08 ноября 2018

Я понимаю, что к любому объекту, созданному в 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, , но это не обязательно так


Материал для чтения:

  • Вы не знаете JS: это и прототипы объектов ;все книги серии gettify довольно крутые.
  • http://felix -kling.de / jsbasics / ; бесстыдный плагин для некоторых очень лаконичных слайдов, которые я создал для класса JavaScript, который я преподаю время от времени. Может быть недостаточно подробным, чтобы быть полезным сам по себе (и содержит опечатки;))
...