[[Прототип]] против прототипа: .. в чем разница?(MyCons .__ proto__ === MyCons.prototype) равно FALSE - PullRequest
6 голосов
/ 26 февраля 2012

Кажется, здесь есть разница ...

Допустим, у нас есть function MyConstructor() {}

MyConstructor's [[Prototype]] - это Function.prototype, , а не MyConstructor.prototype.

Другими словами (нестандартный / "console.log-able") слова:
MyConstructor.__ proto__ не MyConstructor's MyConstructor.prototype

ПОПРОБУЙТЕ:

function MyConstructor() {};
(MyConstructor.__proto__ === MyConstructor.prototype); //false?! why?

Почему это так? Может кто-нибудь объяснить мне разницу в ?

Ответы [ 2 ]

11 голосов
/ 26 февраля 2012

Думайте об этом так. MyConstructor является функциональным объектом, поэтому он был создан Function; поэтому его [[Prototype]] (или __proto__) идентичен Function.prototype.

Таким же образом, var myObj = new MyConstructor() создает объект myObj с [[Prototype]], идентичным MyConstructor.prototype.

Другими словами, у функций есть свойство prototype, и когда вы вызываете функции с new, они создают объект, имеющий [[Prototype]], идентичный свойству prototype функции конструктора ... однако свойство prototype функции не совпадает со свойством [[Prototype]] (или __proto__), поскольку функция следует тем же правилам, что и другие объекты, и получает свое внутреннее свойство [[Prototype]] от функции, которая ее построила (что всегда Function, кстати).


Чтобы объяснить дальше, [[Prototype]] и prototype имеют совершенно разные цели. [[Prototype]] используется при разрешении свойств объекта. Если у объекта нет свойства, проверяется его [[Prototype]], а затем [[Prototype]] этого объекта и т. Д. До тех пор, пока не будет найдено свойство или пока вы не достигнете конца цепочки прототипов.

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

Поскольку функции являются объектами, они имеют как внутреннее свойство [[Prototype]], используемое для разрешения свойств, как с обычными объектами, так и свойство prototype, которое назначается как [[Prototype]] новых объектов, созданных функцией.

1 голос
/ 28 сентября 2017

этот код покажет это очень ясно:

var obj = {};
var arr = [];
var fun = function() {};    

A:     
console.log(obj.prototype);
console.log(arr.prototype);
console.log(fun.prototype);

B:
console.log(arr.__proto__);
console.log(fun.__proto__);

C:
console.log(obj.__proto__);
console.log(arr.__proto__.__proto__);
console.log(fun.__proto__.__proto__);
console.log(fun.prototype.__proto__);

хромированная консоль:

enter image description here

значение этого:

A. в JavaScript «прототип» - это специальный объект, который существует только в функциях - для создания конструктора функций (для вашего вопроса - поэтому «прототип» не равен « proto »).

B. Массив и функции имеют свои собственные proto , со всеми их свойствами и методами, встроенными в JavaScript.

C. все в JavaScript действительно внутри этих объектов, поэтому «прототип». proto 'функций или' proto . proto 'функций и массивов - все равняется ' proto ' объекта.

...