Непонятное поведение массива как свойства класса.
Всем доброго дня. Мне не понятен результат выполнения следующего кода.
var SomeClass = function(){};
SomeClass.prototype = {
someArr: new Array(),
operateArr:function(){
this.someArr[this.someArr.length] = 53;
}
};
var o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53]
o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53, 53]
o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53, 53, 53]
Разве не должен массив обнуляться при создании нового объекта? |
Цитата:
Исправление:
var SomeClass = function () {
*!*
this.someArr = [];
*/!*
};
SomeClass.prototype = {
operateArr: function () {
this.someArr[this.someArr.length] = 53;
}
};
var o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53]
o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53]
o = new SomeClass();
o.operateArr();
console.log(o.someArr); // [53]
|
Хм, но если в прототипе будет не массив а другие переменные(пробовал со строками и числами), то они будут вести себя так как я предполагал, т.е. будут перезаписываться для каждого нового объекта. В чем разница между массивами и числовыми переменными в данном случае?
var SomeClass = function(){};
SomeClass.prototype = {
someVar: 25,
operateVar:function(){
this.someVar++;
}
};
var o = new SomeClass();
o.operateVar();
console.log(o.someVar); // 26
o = new SomeClass();
o.operateVar();
console.log(o.someVar); // 26
o = new SomeClass();
o.operateVar();
console.log(o.someVar); // 26
|
Цитата:
|
Так там же new Array(), а не newArray = oldArray. При присваивании понятное дело передается ссылка, а при создании нового объекта поидее должен создаваться пустой массив. Я не прав?
|
vamfirius,
new Array() - срабатывает единожды при СОЗДАНИИ ПРОТОТИПА, а далее при создании экземпляра класса - экземпляр получает ссылку на свой прототип, и ,соответственно, ссылку на УЖЕ СОЗДАННЫЙ массив. |
tsigel,
Понял, спасибо. Всем кто отписался выше тоже спс. Плюсанул карму. |
| Часовой пояс GMT +3, время: 09:14. |