Почему создание нового экземпляра класса Javascript перезаписывает старый экземпляр? - PullRequest
0 голосов
/ 23 апреля 2020

Почему последняя строка в следующем коде выводит there? Похоже, что создание нового экземпляра того же класса перезаписывает старый экземпляр. Есть ли способ предотвратить такое поведение, чтобы вместо последней строки выводилось here?

var one = function(params) {
    _params = params;

    var two = {
        load: function(params) {
            _params = params;

            return this;
        },

        getHere: function() {
            return _params.here;
        }
    };

    return two.load(params);
};

oldOne = new one({ here: 'here' });

console.log(oldOne.getHere());

newOne = new one({ here: 'there' });

console.log(newOne.getHere());

console.log(oldOne.getHere());

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Это не то, что происходит. Проблема в том, что вы не объявляете свои переменные, поэтому JavaScript решает создать глобальные переменные для вас. Затем глобальное значение _params перезаписывается при каждом вызове one.

. Вот как исправить код, чтобы он работал так, как ожидалось:

const one = function(params) {
    let _params = params;

    var two = {
        load: function(params) {
            _params = params;

            return this;
        },

        getHere: function() {
            return _params.here;
        }
    };

    return two.load(params);
};

const oldOne = new one({ here: 'here' });

console.log(oldOne.getHere());

const newOne = new one({ here: 'there' });

console.log(newOne.getHere());

console.log(oldOne.getHere());

Теперь каждый вызов one объявит различные экземпляры _params.

0 голосов
/ 23 апреля 2020

Ваш _param является глобальной переменной, чтобы сделать его областью видимости, вы можете использовать это ключевое слово как

var one = function(params) {
    this._params = params;

    var two = {
        load: function(params) {
            this._params = params;

            return this;
        },

        getHere: function() {
            return this._params.here;
        }
    };

    return two.load(params);
};

oldOne = new one({ here: 'here' });

console.log(oldOne.getHere());

newOne = new one({ here: 'there' });

console.log(newOne.getHere());

console.log(oldOne.getHere());
...