Я изучаю модели «ООП» в JavaScript и с нетерпением жду совета, как мне решить проблему, с которой я столкнулся. (Я буду использовать терминологию «экземпляр» позже, однако теперь я знаю, что в JavaScript нет экземпляров.) Рассмотрим следующий код:
function Class1(){
this.locvar1 = "locvar1";
this.locvar2 = "locvar2";
}
function Class2(){
this.set = function(){
this.locvar1 = "ch_locvar1";
}
}
Class2.prototype = new Class1;
//we'll get two instances from Class2
var x = new Class2();
x.set(); // we'll change the x's field with that (hoping that)
var y = new Class2(); // hoping that this will be a totally new instance,
// and the previous set() won't change it at all
Хорошо, этот код будет работать так, как я хотел. Я создаю два новых объекта и их прототип
будет то же самое после того, как я позвонил x.set ().
x.locvar1's value: "ch_locvar1"
x.locvar2's value: "locvar2"
y.locvar1's value: "locvar1"
y.locvar2's value: "locvar2"
their prototypes value:
locvar1 : "locvar1",
locvar2 : "locvar2"
Проблема возникает, когда я пытаюсь использовать дополнительные объекты в поле класса 1.
function Class1(){
this.locvar1 = {a : "a"};
this.locvar2 = "locvar2";
}
function Class2(){
this.set = function(){
this.locvar1.a = "ch_locvar1";
}
}
Class2.prototype = new Class1;
var x = new Class2();
x.set();
var y = new Class2();
Это выйдет:
x.locvar1.a's value: "ch_locvar1"
x.locvar2's value: "locvar2"
what's ok, but..:
y.locvar1.a's value: "ch_locvar1"
y.locvar2's value: "locvar2"
their prototypes value:
locvar1.a : "ch_locvar1",
locvar2 : "locvar2"
Так что, похоже, с помощью оператора "this.locvar1.a" я изменяю прототип объекта {a: "a"} глобально, а не локальный экземпляр "this.locvar1" ...
Я уверен в этом? Как я могу код вокруг этого? Я пытался изменить "this.locvar1 = new {a:" a "};" потому что это кажется мне логичным, но результат тот же.