У меня есть объект в Javascript, который напоминает ниже

var configs = {
    init: function() {
        this.var1 = 'variable 1',
        this.var2 = 'variable 2'
    },

    outer: {
        inner: {
            inner_var1: 'inner variable 1',
            inner_var2: 'inner variable 2',
            inner_var3: 'inner variable 3',
            inner_function: function(item_1, item2) {
                console.log(this.var1);
            }
        }
    }
}

var config = Object.create(configs);
config.init();
document.config = config;

Мне нужно ввести переменную, установленную в методе init, в метод external.inner.inner_function. Но предостережение в том, что я не могу передать больше переменных в список параметров метода inner_function. («Внутренний» объект - это набор опций для стороннего плагина, и функция определяется плагином и принимает только два параметра)

Как я могу ссылаться на this.var1 из внутреннего метода?

Благодарность

0
Typhoon101 17 Апр 2019 в 22:59

2 ответа

Лучший ответ

Объекты не имеют автоматической ссылки на содержащиеся в них объекты, поэтому в объекте inner нет встроенного способа добраться до outer или config. Вам нужно передать объект явно.

Таким образом, вы должны определить это как:

inner_function: function(config, item_1, item_2) {
    console.log(config.var1);
}

И назовите его так:

document.config.outer.inner.inner_function(document.config, i1, i2);

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

var configs = {
    init: function() {
        this.var1 = 'variable 1',
        this.var2 = 'variable 2'
    },

    outer: {
        inner: {
            inner_var1: 'inner variable 1',
            inner_var2: 'inner variable 2',
            inner_var3: 'inner variable 3',
            inner_function: function(item_1, item2) {
                console.log(this.parent.parent.var1);
            }
        }
    }
}
configs.outer.inner.parent = configs.outer;
configs.outer.parent = configs;

0
Barmar 17 Апр 2019 в 20:09

Ваша проблема возникает из-за того, что у вас inner_function вызвано правильное значение для this. Поэтому убедитесь, что this правильно привязан к нему. Например:

plugin.init(document.config.outer.inner.bind(document.config))
0
trincot 17 Апр 2019 в 20:13