Свойства, объявленные * в * конструкторе, видны в экземплярах. Зачем?
В системе наследования прототипов 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 );