Свойства, объявленные * в * конструкторе, видны в экземплярах. Зачем?

В системе наследования прототипов Javascript внутренняя ссылка на прототип объекта устанавливается на свойство его конструктора "prototype", которое само является объектом.

Свойства свойства "prototype" конструктора могут быть разрешены, как если бы они были свойствами экземпляров объекта. Однако фактические свойства объекта конструктора недоступны для экземпляра:

function MyConstructor() { }
MyConstructor.x = 3
MyConstructor.prototype.y = 7

a = new MyConstructor()
a.x == 3    // FALSE
a.y == 7    // TRUE

Однако, если собственность (" x ") Конструктора объявляется в теле функции с this ключевое слово, эти свойства , конечно, разрешаются экземплярами:

function MyConstructor() {
    this.x = 3
}
MyConstructor.prototype.y = 7

a = new MyConstructor()
a.x == 3    // TRUE

Зачем? В чем разница?

1 ответ

Решение

Когда вы делаете это:

MyConstructor.x = 3;

... вы только добавили свойство к экземпляру объекта Function, на которое ссылается MyConstructor, У объекта Function есть много свойств, которые не становятся частью экземпляра (и вы не захотите их).

Таким образом, механизм создания свойств экземпляра через конструктор заключается в использовании this.x метод.

Когда конструктор работает, this это объект, который возвращается. Так что это просто удобство, поэтому вам не нужно делать:

a = new MyConstructor();
a.x = 3;
a.x == 3    // TRUE!

Так как this поскольку конструктор совпадает с результирующим объектом, нет необходимости делать это явно при каждом создании нового экземпляра.

prototype Объект - это просто объект, на который ссылаются все экземпляры MyConstructor так что если у экземпляра нет свойства, он переходит к prototype найти.


Чтобы проиллюстрировать отношения между this и новый экземпляр, рассмотрим этот пример:

Пример: http://jsfiddle.net/M2prR/

var test; // will hold a reference to "this"

function MyConstructor() {
    test = this; // make "test" reference "this"
}

   // create a new instance
var inst = new MyConstructor;

   // see if they are the same object. This will alert "true"
alert( inst === test );
Другие вопросы по тегам