Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятное поведение массива как свойства класса. (https://javascript.ru/forum/misc/56586-neponyatnoe-povedenie-massiva-kak-svojjstva-klassa.html)

vamfirius 24.06.2015 05:29

Непонятное поведение массива как свойства класса.
 
Всем доброго дня. Мне не понятен результат выполнения следующего кода.

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]


Разве не должен массив обнуляться при создании нового объекта?

Endy 24.06.2015 08:28

Цитата:

Сообщение от vamfirius
Разве не должен массив обнуляться при создании нового объекта?

нет не должен,потому что он общий для всех объектов,т.к изменяется в прототипе.

Исправление:
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]

vamfirius 24.06.2015 09:31

Хм, но если в прототипе будет не массив а другие переменные(пробовал со строками и числами), то они будут вести себя так как я предполагал, т.е. будут перезаписываться для каждого нового объекта. В чем разница между массивами и числовыми переменными в данном случае?
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

nerv_ 24.06.2015 09:43

Цитата:

Сообщение от vamfirius
Хм, но если в прототипе будет не массив а другие переменные(пробовал со строками и числами), то они будут вести себя так как я предполагал, т.е. будут перезаписываться для каждого нового объекта. В чем разница между массивами и числовыми переменными в данном случае?

https://learn.javascript.ru/object-reference

vamfirius 24.06.2015 09:54

Так там же new Array(), а не newArray = oldArray. При присваивании понятное дело передается ссылка, а при создании нового объекта поидее должен создаваться пустой массив. Я не прав?

tsigel 24.06.2015 10:08

vamfirius,
new Array() - срабатывает единожды при СОЗДАНИИ ПРОТОТИПА, а далее при создании экземпляра класса - экземпляр получает ссылку на свой прототип, и ,соответственно, ссылку на УЖЕ СОЗДАННЫЙ массив.

vamfirius 24.06.2015 10:31

tsigel,
Понял, спасибо. Всем кто отписался выше тоже спс. Плюсанул карму.


Часовой пояс GMT +3, время: 07:23.