Прототип анонимных объектов JavaScript - PullRequest
4 голосов
/ 11 февраля 2012

Я изучаю модели «ООП» в 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 "};" потому что это кажется мне логичным, но результат тот же.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Это даст вам наследование прототипа, которое вы ожидали:

function Class1(){
   this.locvar1 = {a : "a"};
   this.locvar2 = "locvar2";
}

function Class2(){
    this.__proto__ = new Class1()
    this.set = function(){     
        this.locvar1.a = "ch_locvar1";
    }
} 

var x = new Class2();
x.set();

var y = new Class2();

document.write(x.locvar1.a) // outputs 'ch_locvar1'
document.write('<br />')    
document.write(y.locvar1.a) // outputs 'a'

Я установил объект-прототип на new Class1, когда создается экземпляр Class2. Это не работает, потому что оба объекта будут ссылаться на один и тот же объект-прототип, а JavaScript передается по ссылке, как объяснили другие.

1 голос
/ 11 февраля 2012

this.locvar1 = new {a : "a"}; не так, попробуйте this.locvar1 = {a : "ch_locvar1"};.

...