Свойство конструктора: __proto __. Constructor vs prototype.constructor - PullRequest
0 голосов
/ 19 февраля 2019

Я довольно новичок в Javascript, и я пытаюсь углубиться и понять наследование, функции конструктора и цепочку прототипов.Итак, я создал функцию конструктора как таковую,

var a = function(){this.integer=1,this.float=1.0,this.string="one"}

Теперь эта функция имеет свойство prototype.constructor, свойство конструктора и свойство __proto__.constructor.

Я понимаю, что__proto__.constructor == функция конструктора, выполненная для создания функции a.Кроме того, prototype.constructor - это функция, которая выполняется, когда я создаю экземпляр «a», используя ключевое слово new.

Однако я не понимаю, для чего предназначено третье свойство конструктора.Это равно __proto__.constructor.

Кроме того, b.__proto__.constructor! == Object.prototype.constructor, как я и думал.Почему это?

1 Ответ

0 голосов
/ 19 февраля 2019

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).

...