[JavaScript]При наследовании поля объекты общие для всех инс
От: dotneter  
Дата: 17.08.10 06:12
Оценка:
function A(){
    this.a = {};
}

function B(){}
B.prototype = new A;

var b1= new B();
var b2= new B();
b1.a.x = 1;
b2.a.x = 2;
log(b1.a.x == 1);//false
log(b2.a.x == 2);//true

Хотелось бы понять сокральный смысл, для чего так сделано.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re: [JavaScript]При наследовании поля объекты общие для всех
От: anonymous Россия http://denis.ibaev.name/
Дата: 17.08.10 13:40
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Хотелось бы понять сокральный смысл, для чего так сделано.


Прототипное программирование.
Re[2]: [JavaScript]При наследовании поля объекты общие для в
От: dotneter  
Дата: 17.08.10 15:52
Оценка:
Здравствуйте, anonymous, Вы писали:

Вы уверены что там описано почему в javascript поля объекты и поля примитивных типов видут себя по разному?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[3]: [JavaScript]При наследовании поля объекты общие для в
От: anonymous Россия http://denis.ibaev.name/
Дата: 17.08.10 16:11
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Вы уверены что там описано почему в javascript поля объекты и поля примитивных типов видут себя по разному?


Там описано, почему
b1.a == b2.a; // true

со всеми вытекающими последствиями.
Re[4]: [JavaScript]При наследовании поля объекты общие для в
От: dotneter  
Дата: 17.08.10 17:52
Оценка:
Здравствуйте, anonymous, Вы писали:

Меня смутило что если тип поля а заменить на int.

function A(){
    this.a = 0;
}

function B(){}
B.prototype = new A;

var b1= new B();
var b2= new B();
b1.a = 1;
b2.a = 2;
log(b1.a == 1);//true
log(b2.a == 2);//true

То все работает как и предполагалось. Но в общем у меня в голове таки родилось более менее
логичное объяснение.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[5]: [JavaScript]При наследовании поля объекты общие для в
От: Alexander Polyakov  
Дата: 22.08.10 14:01
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Здравствуйте, anonymous, Вы писали:


D>Меня смутило что если тип поля а заменить на int.


D>
D>function A(){
D>    this.a = 0;
D>}

D>function B(){}
D>B.prototype = new A;

D>var b1= new B();
D>var b2= new B();
D>b1.a = 1;
D>b2.a = 2;
D>log(b1.a == 1);//true
D>log(b2.a == 2);//true

D>

D>То все работает как и предполагалось. Но в общем у меня в голове таки родилось более менее
D>логичное объяснение.
Дело вовсе не в примитивности целого типа. Вот так тот же результат:
function A(){
    this.a = {};
}

function B(){}
B.prototype = new A;

var b1= new B();
var b2= new B();
b1.a.x = 1;
b2.a = {};
b2.a.x = 2;
log(b1.a.x == 1);//true
log(b2.a.x == 2);//true

Т.е. в последнем вашем примере вы просто оверайдите в наследниках родительский филд.
Re: [JavaScript]При наследовании поля объекты общие для всех
От: Аноним  
Дата: 27.09.10 04:19
Оценка: +1
Здравствуйте, dotneter, Вы писали:

D>
D>function A(){
D>    this.a = {};
D>}

D>function B(){}
D>B.prototype = new A;

D>var b1= new B();
D>var b2= new B();
D>b1.a.x = 1;
D>b2.a.x = 2;
D>log(b1.a.x == 1);//false
D>log(b2.a.x == 2);//true

D>

D>Хотелось бы понять сокральный смысл, для чего так сделано.

Попробую объяснить, возможно сам ошибаюсь.

В вашем примере вы не используете наследование. Вы просто говорите, что у объектов B, прототипом является объект A.
Дальше вы создаете два объекта типа B.
Дальше происходит чтение свойства "a" в объектах b1, b2, т.к. у них общий протип, то вы получаете в обоих случаях одинаковый объект.
Дальше вы пишите в подсвойство "x" общего объекта "a" для обоих объектов b1, b2.
Поэтому x сначала становится равным 1, потом 2.

картина меняется, если вы действительно используете наследование. Для этого надо делать несколько махинаций. Присваивание протипа — не достаточно:

function A(){
    this.a = {};
}

function B(){
    A.prototype.constructor.call(this);
}
B.prototype = new A;
B.prototype.constructor = B;

var b1= new B();
var b2= new B();
b1.a.x = 1;
b2.a.x = 2;
alert((b1.a.x == 1));//true
alert((b2.a.x == 2));//true


Здесь, при создании B, создается и объект базового класса, т.е. A
Свойство "a" — становится уникальным и свойством объектов b1, b2. Соотвественно и запись в x у них не перезатирает друг друга.

Возможны опечатки. Синтаксис наследования вспомнил по памяти, но идея в этом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.