2016-10-12 5 views
0
var object1 = { 
    name: "abc", 
    age: 21 
} 

var Object2 = function() {} 
Object2.prototype = object1; 
Object2.prototype.hello = function() { 
    console.log("Hello"); 
} 

var obj = Object.create(object1); 
for (var prop in obj) { 
    console.log(prop + ": " + obj[prop]); 
} 

Выход этого кода:Javascript назначая прототип спутанность

name: abc 
age: 21 
hello: function() { 
    console.log("Hello"); 
} 

Obj создается путем установки его прототип как object1, который не имеет функцию «привет», так почему в списке в выходе? Если я прокомментирую «Object2.prototype = object1;», функция «hello» больше не будет отображаться на выходе. Я не вижу, как связаны obj и Object2. Кто-нибудь может объяснить, что здесь происходит?

ответ

3

После этой линии ...

Object2.prototype = object1; 

... как Object2.prototype и object1 относятся к одному объекту. Следовательно, эта линия ...

Object2.prototype.hello = function() { // ... 

... назначает новое свойство объекта, указанного на object1.

Я не вижу, как связаны obj и Object2.

С var obj = Object.create(object1), вы создаете которые __proto__ свойство указывает на object1 объект. Последний, как мы установили, на самом деле тот же объект Object2.prototype указывает на.


установки Object2.prototype т.е. к объекту без них и со ссылкой на тот же объект?

Если вы хотите Object2.prototype скопировать свойства из object1, просто clone an object.

+0

Ох хорошо. Спасибо. Есть ли способ избежать этого? I. Установление Object2.prototype объекту, без которого оба ссылаются на один и тот же объект? – SpamJoe

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