Javascript: каждый элемент массива объектов, имеющих одинаковое значение - PullRequest
3 голосов
/ 27 марта 2019

Я создал двумерный массив, который содержит объект, и у каждого объекта есть две переменные.

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

Если я изменю один из объектов, другие объекты тоже изменятся.

class test{
    constructor(x, y){
        self.x = x;
        self.y = y;
    }
    print(){
        console.log(self.x, self.y);
    }
}

arr = new Array(3);

for(let i=0;i<3;i++){
    arr[i] = new Array(3);
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j] = new test(i, j);
    }
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j].print();
    }
}

Это просто печатает девять 2 2. Я понятия не имею, что происходит.

Даже если бы я попытался:

arr[1][2] = new test(2, 3);

печатает девять 2 3.

Буду признателен, если кто-нибудь поможет мне.

: Р * * тысяча двадцать-одна

Ответы [ 4 ]

10 голосов
/ 27 марта 2019

JavaScript это не Python, используйте this, и он будет работать.

class test{
    constructor(x, y){
        this.x = x;
        this.y = y;
    }
    print(){
        console.log(this.x, this.y);
    }
}

arr = new Array(3);

for(let i=0;i<3;i++){
    arr[i] = new Array(3);
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j] = new test(i, j);
    }
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j].print();
    }
}

(Вы, к счастью / несчастью, в итоге использовали Window.self, везде)

5 голосов
/ 27 марта 2019

Назначение x и y на self в конструкторе - ваша проблема, измените self на this, чтобы указать на текущий экземпляр объекта класса.

class test{
    constructor(x, y){
        this.x = x;
        this.y = y;
    }
    print(){
        console.log(this.x, this.y);
    }
}

arr = new Array(3);

for(let i=0;i<3;i++){
    arr[i] = new Array(3);
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j] = new test(i, j);
    }
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j].print();
    }
}

Из MDN документы :

Свойство Window.self только для чтения возвращает само окно в видеWindowProxy.Он может быть использован с точечной нотацией для оконного объекта (то есть, window.self) или автономно ( self )

Так что в вашем случае, когда вы назначили x иОт y до self.x и self.y были созданы два новых свойства self, и вы продолжали перезаписывать их в цикле, в результате чего последнее значение (2,2) итерации было присвоено xи y свойство self

4 голосов
/ 27 марта 2019

Используемая вами self переменная на самом деле window объект , поэтому self.x = x просто присоединяет свойство x к window и задает значение. Когда вы вызываете console.log(self.x, self.y);, он получает свойства x и y от window, и, поскольку существует только один его экземпляр, вы получаете последние присвоенные значения.

class test{
    constructor(x, y){
        self.x = x;
        self.y = y;
    }
    print(){
        console.log(self.x, self.y);
    }
}

new test(4, 2);

console.log(window.x);
console.log(window.y);

Вы хотите использовать this для ссылки на текущий экземпляр объекта

class test{
    constructor(x, y){
        this.x = x;
        this.y = y;
    }
    print(){
        console.log(this.x, this.y);
    }
}

arr = new Array(3);

for(let i=0;i<3;i++){
    arr[i] = new Array(3);
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j] = new test(i, j);
    }
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j].print();
    }
}
2 голосов
/ 27 марта 2019

self не относится к экземпляру class.self под другим именем для window.Посмотрите во фрагменте, что такое self

Согласно MDN

Свойство Window.self только для чтения возвращает само окно

class test{
    constructor(x, y){
        console.log(self === window) //true
        console.log(self) //widnow object       
    }
}
let x = new test(1,2);

Поэтому каждый раз, когда вы создаете новый экземпляр test self.x и self.y, изменяется.self.y и self.x - это то же самое, что и window.x и window.y

Использование this вместо self решит проблему.

class test{
    constructor(x, y){
        this.x = x;
        this.y = y;
    }
    print(){
        console.log(this.x, this.y);
    }
}

arr = new Array(3);

for(let i=0;i<3;i++){
    arr[i] = new Array(3);
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j] = new test(i, j);
    }
}

for(let i=0;i<3;i++){
    for(let j=0;j<3;j++){
        arr[i][j].print();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...