Непонятное поведение массива как свойства класса.
Всем доброго дня. Мне не понятен результат выполнения следующего кода.
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, время: 07:23. |