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

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

 sircapsalot18 июн. 2013 г., 19:05
Двойные скобки обычно обозначают шаблон. Какой-то сценарий может заменить [[Prototype]] путем к пути к библиотеке прототипов?

Ответы на вопрос(3)

Решение Вопроса

внутренняя собственность объекта. ОтECMAScript 8.6.2:

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

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

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

JavaScript [[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__ (произносится как Дандер прото).

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

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

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

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

НОТА: этот ответ ненамереваемся охватить весь процесс создания новых объектов или новых конструкторов, но чтобы помочь лучше понять, что такое[[Prototype]] и как это работает.

 Zach Smith07 авг. 2017 г., 21:43
Это должен быть принятый ответ
 Wilt23 сент. 2016 г., 10:55
Я понимаю. Я только хотел прояснить это в комментарии для других. Из вашего примера это выглядело так, как будто эта строка может быть выполнена в коде;)
 Lior Elrom10 янв. 2019 г., 19:48
@SergeyPleshakov, я думаю, что причина, почему я решил продемонстрировать это с помощью[[Prototype]] был факт, что вопрос о том, чтобы попытаться выяснить, чтоs двойные скобки. Однако вы правы, они одинаковы в этом случае.
 Lior Elrom23 сент. 2016 г., 10:07
@Wilt, как говорится в заголовке, [[Prototype]] является внутренней связью и не может быть доступна напрямую (но она все еще существует). Браузер дает нампрото и JS дает нам getPrototypeOf для доступа к нему. Извините, если бы неДостаточно ясно в ответе. Сравнение есть, чтобы доказать концепцию. Не запускаться в консоли браузера. Надеюсь, это имеет смысл
 Wilt23 сент. 2016 г., 09:49
obj.[[Prototype]] === Foo.prototype выдает синтаксическую ошибку:Uncaught SyntaxError: Неожиданный токен [, Вы можете'Доступ к внутренним свойствам в качестве членов. Проверьте также ответ от @apsillers.
 Sergey Pleshakov10 янв. 2019 г., 18:12
@liorElromobj.[[Prototype]] === Foo.prototype действительно сбивает с толку, почему бы вам не изменить его наobj.__proto__ === Foo.prototype, Это все еще будет точно, правильно?

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

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

 Joseph Silber18 июн. 2013 г., 19:07
@Geek - одиночные скобки могут быть перепутаны с обозначением массива. Как я уже сказал, эти скобки никогда не присутствуют в коде.
 Geek18 июн. 2013 г., 19:06
почему двойные скобки? Одной скобки было бы достаточно? ISN»не так ли?

Ваш ответ на вопрос