__proto__ VS. прототип в JavaScript - PullRequest
       92

__proto__ VS. прототип в JavaScript

707 голосов
/ 01 апреля 2012

Этот рисунок снова показывает, что у каждого объекта есть прототип. Конструктор Функция Foo также имеет свой собственный __proto__, который является Function.prototype, и который в свою очередь также ссылается через свойство __proto__ снова на Object.prototype. Таким образом, повторяю, Foo.prototype просто явный свойство Foo, которое относится к прототипу объектов b и c.

var b = new Foo(20);
var c = new Foo(30);

В чем различия между __proto__ и prototype свойствами?

enter image description here

Цифра взята из здесь .

Ответы [ 25 ]

1 голос
/ 13 июля 2018

__proto__ является основой для конструирования prototype и функцией конструктора, например: function human(){} имеет prototype, которая совместно используется через __proto__ в новом экземпляре функции конструктора. Более подробное прочтение здесь

1 голос
/ 29 марта 2018

А как насчет использования __proto__ для статических методов?

function Foo(name){
  this.name = name
  Foo.__proto__.collection.push(this)
  Foo.__proto__.count++

}

Foo.__proto__.count=0
Foo.__proto__.collection=[]

var bar = new Foo('bar')
var baz = new Foo('baz')

Foo.count;//2
Foo.collection // [{...}, {...}]
bar.count // undefined
1 голос
/ 05 апреля 2017

Каждая созданная вами функция имеет свойство prototype, и она начинает свою жизнь как пустой объект. Это свойство бесполезно, пока вы не используете эту функцию в качестве функции конструктора, то есть с ключевым словом «new».

Это часто путают со свойством __proto__ объекта. Некоторые могут запутаться, за исключением того, что свойство prototype объекта может дать им прото объекта. Но это не так. prototype используется для получения __proto__ объекта, созданного из конструктора функции.

В приведенном выше примере:

function Person(name){
    this.name = name
}; 

var eve = new Person("Eve");

console.log(eve.__proto__ == Person.prototype) // true
// this is exactly what prototype does, made Person.prototype equal to eve.__proto__

Надеюсь, это имеет смысл.

0 голосов
/ 18 июля 2016

!!! Это лучшее объяснение в мире !!!!!

var q = {}
var prototype = {prop: 11}

q.prop // undefined
q.__proto__ = prototype
q.prop // 11

в конструкторах функций движок javascript вызывает это q.__proto__ = prototype автоматически, когда мы пишем new Class, и в __proto__ наборе реквизитов Class.prototype

function Class(){}
Class.prototype = {prop: 999} // set prototype as we need, before call new

var q = new Class() // q.__proto__ = Class.prototype
q.prop // 999

Наслаждайтесь%)

0 голосов
/ 25 июня 2014

Насколько я понимаю, __proto__ и прототип все используются для техники цепочки прототипов. разница в том, что функции с именами подчеркивания (например, __proto__) вообще не предназначены для разработчиков, вызываемых явно. другими словами, они просто для некоторых механизмов, таких как наследование и т. д., они являются «бэк-эндами». но функции, названные без подчеркивания, предназначены для вызова в явном виде, они 'front-end'.

...