Как значение __proto__ присваивается в javascript?

Недавно я играл с объектом-прототипом javaScript и наткнулся на приведенный ниже пример.

function Foo(){ 

}

Foo.prototype=null;

var fooObj=new Foo();

Когда я смотрю на fooObj из инструментов разработчика, свойство __proto__ указывает на прототип глобального объекта, и я могу получить доступ ко всем свойствам и функциям, определенным в объекте-прототипе объекта. который должен указывать на объект-прототип функции Foo, поскольку я присвоил ему значение null, я ожидал, что __proto__ будет указывать на null, указание __proto__ может иметь больше смысла, но я хочу понять, как значение присваивается __proto__ после создания объекта? что заставляет его указывать объект-прототип Object?

Я видел много вопросов по прототипу и прототипу, но ни один из них не решает моих сомнений.


person Akshay Naik    schedule 08.08.2017    source источник
comment
Я подозреваю, что присвоение свойства прототипа null или undefined или чему-то еще, кроме объекта, рассматривается как особый случай. Я знаю, например, что объекты пользовательской земли с null __proto__ были невозможны до Object.create в ES5.   -  person Ben Aston    schedule 08.08.2017


Ответы (1)


Полная информация приведена в спецификации*. , но когда вы используете функцию-конструктор с null для свойства prototype, new назначает Object.prototype (ну, прототип по умолчанию для области; Object.prototype для наших целей) в качестве прототипа нового объекта.

Я считаю, что единственный способ создать объект без прототипа — это Object.create(null).

Вы можете установить прототип на null после создания объекта с помощью Object.setPrototypeOf, но в целом лучше избегать изменения прототипа объекта после его создания.


* В частности, он спрятан в GetPrototypeFromConstructor. , в котором говорится, что если тип свойства prototype конструктора не является Object (для этой цели null имеет тип Null, а не тип Object), используйте прототип по умолчанию для области.

person T.J. Crowder    schedule 08.08.2017