a.__proto__
является прототипом Function
(а именно Function.prototype
).Это объект, от которого все функции наследуют специфичные для функции методы, такие как call
, apply
, bind
и т. Д. Это правда, что a.__proto__.bind == a.bind
.
a.__proto__.constructor
является Function
конструктор, т. е. функция Function
.Прототип Function
имеет ссылку на связанный с ним конструктор через свойство constructor
, так как это всегда отношение по умолчанию между объектом-прототипом и конструктором.(Подробнее об этой «взаимосвязи по умолчанию» в следующих двух абзацах.)
Совершенно по-другому это a.prototype
- в JavaScript любая функция может быть конструктором, т. Е. Ее можно вызывать с помощью new
.Всякий раз, когда функция вызывается с помощью new
, она создает новый объект, чей __proto__
является значением prototype
функции и указывает на вновь созданный объект с помощью this
.Таким образом, в вызове new a()
верно, что this.__proto__
равно a.prototype
.Этот объект-прототип автоматически создается и сохраняется в a.prototype
в момент определения функции a
.
a.prototype.constructor
равен a
, потому что внутренняя подпрограмма JavaScript, которая создает prototype
объектыдля вновь определенных функций (как указано в предыдущем абзаце) всегда дает этому новому прототипу свойство constructor
, которое ссылается на вновь определенную функцию.Чтобы по-настоящему разобраться с сорняками, соответствующая подпрограмма ECMAScript имеет вид 19.2.1.1.1, CreateDynamicFunction , который отмечает, что «свойство prototype
создается автоматически для каждой функции, созданной с помощью CreateDynamicFunction, чтобы обеспечить возможностьчто функция будет использоваться в качестве конструктора. "
a
не имеет своего собственного свойства constructor
, но автоматически наследует a.__proto__.constructor
, доступный как a.constructor
, так же, как наследует любые другие свойствав родительском прототипе (точно так же, как a.bind
на самом деле a.__proto__.bind
).
Наконец, a.__proto__.constructor !== Object.prototype.constructor
, поскольку Object.prototype
не является родительским прототипом объекта функции, а вместо этого Function.prototype
.Вместо этого верно, что a.__proto__.constructor === Function.prototype.constructor
(и, более кратко, a.__proto__ == Function.prototype
и a.__proto__.constructor == Function
).