2016-08-08 5 views
2

Прежде всего, я попыталсяПрототип Javascript проверяет дифференциацию «объявления функции» на «выражение функции», почему?

var o = {}; 
var Derived = function() {} 
Derived.prototype = o; 
var o2 = new Derived(); 
console.log(o.isPrototypeOf(o2)); 

Он печатает "истинный"

Тогда я попробовал выражение функции, как показано ниже:

var o = function(){};   //difference 1 
var Derived = function() {} 
Derived.prototype = new o(); 
var o2 = new Derived();   //difference 2 
console.log(o.isPrototypeOf(o2)); 

Он печатает "ложь"

Я полагаю, что оба

"o={}" declares an object 
"new o()" declares an object. 

Но почему они отличаются конечными результатами?

+0

Я думал, что я должен был быть умным и сказать вам нужно 'Derived.prototype = Object.create (o); 'но я понятия не имею, почему это заставляет его работать или почему это другое ... – Isaac

ответ

2

Это потому, что при назначении объекта на переменную, вы ssigning по ссылке, а это означает, что Derived.prototype равно O даже после того, как вы присваиваете о к Derived. прототип. Это ссылка на объект o, поэтому вы получаете истинное значение, когда вы проверяете прототип, потому что Derived.prototype (который является настоящим прототипом) равен o.

При использовании нового, вы создаете новый объект, который не о больше. o - это только конструктор , позволяющий создать этот новый объект. Таким образом, o не является прототипом, o и Производный.прототип - это не то же самое. o.prototype - прототип. Вы можете упростить ваш пример таким образом, чтобы цель, что реальная разница:

x = {}; 
y = x; 
console.log(x === y); 

против:

x = function(){}; 
y = new x(); 
console.log(x === y, x.prototype.isPrototypeOf(y)); 
0

В первом примере O представляет собой конкретный объект, который расслоение плотной создается механизм, аналогичный new Object()

В то время как во втором примере, это выражение функция. Его не то же самое, что обычный объект js.

Кроме того isProtoType звонок вы делаете с o как объект функции. Не конкретный. В то время как o2 - это конкретный объект, а не объект функции.