2013-05-30 5 views
4

Почему конструктор изменился с Foo на Object после добавления прототипа? Как получить доступ к исходному конструктору?Почему конструктор изменился?

Код:

function Foo() {} 
var foo1 = new Foo(); 
console.log('foo1: ' + foo1.constructor); 

Foo.prototype = {} 
var foo2 = new Foo(); 
console.log('foo2: ' + foo2.constructor); 

Выход:

foo1: function Foo() {} 

foo2: function Object() { 
    [native code] 
} 

http://jsfiddle.net/vDCTJ/

+1

Почему, после перезаписи, конструктор 1 все еще называется вызываемым? -> http://jsfiddle.net/ttqjV/ – acdcjunior

ответ

7

Это происходит потому, что вы дали Foo совершенно новый объект для своего прототипа, и вы не установили, что объект в " конструктор ".

Foo.prototype = { constructor: Foo }; 

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

+0

Это на самом деле то, что я делал, но я просто написал весь конструктор в прототипе: P –

1

Вы не можете.

foo1 был создан с начальным Foo.prototype объекта, который имеет ссылку на constructorFoo, которую он наследует.

Напротив, foo2 наследует от пустого объекта, который вы установили Foo.prototype, перед тем, как его создать. И этот объект наследует его свойство constructor от Object.prototype, поэтому foo2.constructor === Object.

Смежные вопросы