2015-01-19 4 views
1

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

Вот простой пример:

var Test = function() {}; 
 
Test.prototype = { 
 
\t bonjour: null, 
 
\t hello: { 
 
\t \t hum: null, 
 
\t \t ya: null, 
 
\t }, 
 
}; 
 

 
var testA = new Test(); 
 
testA.bonjour = 'Aaa'; 
 
testA.hello.hum = 'Bbb'; 
 
// return "Aaa" 
 
console.log(testA.bonjour); 
 
// return "{ hum: 'Bbb', ya: null }" 
 
console.log(testA.hello); 
 

 
console.log(''); 
 

 
var testB = new Test(); 
 
// return "null" -> ok 
 
console.log(testB.bonjour); 
 
// return "{ hum: 'Bbb', ya: null }" -> wtf ?! 
 
console.log(testB.hello);

Кто-нибудь есть какие-либо идеи, почему? Спасибо.

+0

Мутирующий прототип влияет на все экземпляры, используя этот прототип. Более подробную информацию об этом можно найти здесь: http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

4

Значение вашего свойства «hello» в прототипе является ссылкой на объект. Каждый построенный экземпляр будет иметь доступ к этой ссылке, но есть только один объект. Таким образом, изменения, внесенные в этот объект через один экземпляр, будут видны из всех остальных.

Вы можете увидеть это, добавив

console.log(testA.hello === testB.hello); // will log "true" 

Если вы хотите, чтобы каждый экземпляр имеет свой собственный «привет» объект, вы должны присвоить свойство в конструкторе.

var Test = function() { 
    this.hello = { hum: null, ya: null }; 
}; 
+0

Okk. На самом деле, это абсолютно логично, но я сразу сходил с ума! ^^ Ty – SiteXw

+0

Обычно, когда вы используете прототипы, вы просто хотите определить методы на прототипе. Предполагается, что вы будете изменять значения для каждого экземпляра, но вы не будете изменять его методы. –

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