2015-01-29 3 views
0
function myclass(){ 

} 

myclass.prototype = { 
    stuff: {}, 

    getStuff: function(){ 
     return Object.keys(this.stuff).length; 
    } 
}; 

var m1 = new myclass(); 
m1.stuff[5] = 'test'; 
m1.stuff[6] = 'test'; 

var m2 = new myclass(); 
m2.stuff[12] = 'test'; 
m2.stuff[14] = 'test'; 

alert(m2.getStuff()); // 4 instead of 2 ?! 

Может ли кто-нибудь объяснить причину, почему предупреждение печатает 4?Свойство, разделяемое между классами в javascript

Если я создал новый экземпляр моей функции, свойство stuff должно быть пустым.

+0

Вы, вероятно, хотите, чтобы объявить его в конструкторе, как 'this.stuff = {}' – elclanrs

+0

Прототип ш ared, есть только один экземпляр материала, и при его изменении для всех экземпляров. Подробно объясняется здесь: http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

1

Что вы здесь делаете, как правило, считается плохой практикой. Вы не хотите перезаписывать прототип, но вы хотите добавить его.

Теперь к сути вашей проблемы. Вы определяете stuff как атрибут прототипа. Это означает, что любой объект, созданный с использованием этого прототипа, поделится этим объектом. Если вы хотите, чтобы каждый экземпляр имеет свой собственный stuff, она должна быть переменная экземпляра:

function myclass(){ 
    this.stuff = {}; 
} 

myclass.prototype = { 
    getStuff: function(){ 
    return Object.keys(this.stuff).length; 
    } 
}; 

Но, как я уже сказал, не переопределить прототип, добавьте на него:

function myclass(){ 
    this.stuff = {}; 
} 

myclass.prototype.getStuff = function(){ 
    return Object.keys(this.stuff).length; 
} 

сейчас , что добавляется stuff будет добавлен только к этому конкретному примеру:

var foo = new myclass(); 
foo.stuff.thing = "Hey, I'm foo"; 

var bar = new myclass(); 
bar.stuff.thing = "Hey, I'm bar"; 

console.log(bar.stuff); //{thing: "Hey, I'm bar"} 
+0

wow js невероятно противоречиво – thelolcat

+0

Как только вы начнете разбираться с тем, как работает прототипное наследование, оно не будет чувствовать себя настолько противоречивым – Brennan