2016-12-04 5 views
0

У меня есть проблема, чтобы понять это, даже пошатываться в Интернете. Вот мой сниппет в javscript:Наследование прототипа Javascript с объектами в объектах

TEST=function(){}; 
    TEST.prototype={ 
     b:{ 
      b1:"", 
      b2:{} 
     } 
    }; 

    //Instance 1 
    var first=new TEST(); 
    first.b.b1="TEXT"; 

    //Instance 2 
    var second=new TEST(); 

    console.log("Result",second.b.b1); 

консоли журнала будет выводить «TEXT», и я хочу «». Поэтому мне интересно, почему я получаю этот результат и почему он меняет прототип «ТЕСТ» (это моя основная проблема), при создании нового экземпляра и затем задании значений?

Я получил помощь от Берги и Миколы (спасибо) и дубликата. Но я все еще думаю, что я потерял ресурс по этому поведению и задаюсь вопросом, почему он построен таким образом? При работе над экземпляром нет необходимости обновлять прототип.

ответ

1

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

Чтобы исправить это. Вам нужно установить значение в конструкторе, чтобы оно инициировало различное значение для каждого экземпляра.

Это будет выводить то, что вы хотите.

TEST=function(){ 
    this.b ={ 
     b1:"", 
     b2:{} 
    } 
}; 
TEST.prototype.forAll = "im global"; 
//Instance 1 
var first=new TEST(); 
first.b.b1="TEXT"; 

//Instance 2 
var second=new TEST(); 

console.log("Second",second.b.b1, second.forAll); 
console.log("First",first.b.b1, first.forAll); 

Надеюсь, это поможет.

+0

Большое спасибо, я перестрою свой конструктор. Но я не могу понять логику, почему first.b.b1 и first .__ proto __. B.b1 и window.TEST.prototype.b.b1 - то же самое? – Oddis

+1

@Oddis Потому что есть только один объект, а 'TEST.prototype.b' и' first.b' и 'second.b' все указывают на это – Bergi

+0

Благодаря Берги и Николаю, и я принимаю это. Но я думаю, что я потерял ресурс по этому поведению. Еще раз спасибо. – Oddis

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