Подтвердить что ты не робот

Каково значение двойных скобок для свойства [[prototype]] в JavaScript?

Я знаю, что каждый объект JavaScript имеет внутреннее свойство [[Prototype]]. Некоторые реализации позволяют получить доступ к нему через свойство, называемое __proto__, а другое - нет. Есть ли какое-либо особое значение скобок, окружающих это свойство?

4b9b3361

Ответ 1

Это "внутреннее свойство" объекта. Из ECMAScript 8.6.2:

В этой спецификации используются различные внутренние свойства для определения семантики значений объекта. Эти внутренние свойства не являются частью языка ECMAScript. Они определяются этой спецификацией исключительно для пояснительных целей. Реализация ECMAScript должна вести себя так, как если бы она создавалась и управлялась внутренними свойствами описанным здесь способом. Имена внутренних свойств заключены в двойные квадратные скобки [[]].

Утверждение "Эти внутренние свойства не являются частью языка ECMAScript" означает, что внутренние свойства не являются идентификаторами, которые могут использоваться в реальном коде. Внутренние свойства недоступны как члены объектов, которые их содержат. Однако они могут быть доступны с помощью определенных функций или свойств (например, некоторые браузеры достаточно любезны, позволяют устанавливать и получать [[Prototype]] через свойство __proto__, а спецификация ES5 допускает доступ только для чтения через Object.getPrototypeOf).

Использование двойных скобок над отдельными скобками, вероятно, во избежание возможной путаницы с фактической нотной скобкой (т.е. доступа к свойствам).

Ответ 2

JavaScript [[Prototype]]

Двойная скобка [[Prototype]] - это внутренняя связь, которая связывает один объект с другим.

При создании функции создается объект свойства с именем prototype, который добавляется в переменную имени функции (которую мы называем constructor). Этот объект указывает или имеет внутренне-частную ссылку на собственный объект JavaScript).

Пример:

function Foo () {
    this.name = 'John Doe';
}

// Foo has an object 'property' called prototype 
// prototype was created automatically when we declared the function Foo.
// Now, we can assign properties to it without declaring the prototype object first.
Foo.prototype.myName = function () {
    return 'My name is ' + this.name;
}

Теперь, если мы создадим новый объект из Foo используя ключевое слово new, мы в основном создадим (среди прочего) новый объект, имеющий внутреннюю ссылку на прототип функции (Foo), который мы обсуждали ранее:

var obj = new Foo();

obj.__proto__ === Foo.prototype      // true
obj.[[Prototype]] === Foo.prototype  // true

как

obj.__proto__ === obj.[[Prototype]]  // true

Поскольку [[Prototype]] является частной связью с этим функциональным объектом, многие браузеры предоставляют нам общедоступную связь. Это __proto__ (произносится как Dunder Proto).

__proto__ на самом деле есть геттер функция, которые принадлежат к родному объекту JavaScript и возвращает внутреннюю-частный прототип увязку независимо от this связывания (возвращает [[Prototype]] из obj):

obj.__proto__ === Foo.prototype // true

Кстати, начиная с ES5, мы можем использовать метод getPrototypeOf для получения внутренней частной связи:

obj.__proto__ === Object.getPrototypeOf(obj) // true

ПРИМЕЧАНИЕ: этот ответ не предназначен для того, чтобы охватить весь процесс создания новых объектов или новых конструкторов, но чтобы помочь лучше понять, что такое [[Prototype]] и как он работает.

Ответ 3

Причина в скобках означает, что это частная собственность. Сами скобки никогда не используются в коде.

Как вы указали, некоторые реализации предоставляют доступ к этому закрытому свойству в __proto__, но нестандартны.