2015-12-01 1 views
1

У меня есть этот "класс":TypeError: Невозможно установить свойство "STRING" неопределенных в STRING (Javascript)

function BooleanAssoc(keyNames) { 
    this.assoc = {}; 
    $.each(keyNames, function(i, val) { 
     this.assoc[val] = false; 
    }); 
}; 

Я использую это так:

var signUpStates = new BooleanAssoc([ 
    "CNPJ", 
    "PASSWORDS", 
    "ADDRESS", 
    "GENERAL_FIELDS", 
    "STATE", 
    "CITY", 
    "SEGMENT", 
    "PRODUCT", 
    "EMAIL", 
    "TERMS" 
]); 

Я не понимаю почему я получаю TypeError. Возможно, это мой ум, который слишком «питоничен». Я создаю словарь («Ассоциативный массив»), я перебираю список строк и создаю ключи и соответствующим образом присваиваю их значения. Что я делаю не так??

+0

Попробуйте привязать обратный вызов к '$ .each' к' this': '$ .each (key ... (i, val) {}. Bind (this))'. –

ответ

3

Ваш this не this вы ожидаете.

Try:

function BooleanAssoc(keyNames) { 
    this.assoc = {}; 

    $.each(keyNames, function(i, val) { 
    this.assoc[val] = false; 
    }.bind(this)); 
}; 

ES5 среды вы можете просто использовать .forEach тоже. При использовании ES6, вы можете использовать функции стрелок, которые не связывают this и использовать родительский объем:

function BooleanAssoc(keyNames) { 
    this.assoc = {}; 

    keyNames.forEach(val => { 
    this.assoc[val] = false; 
    }); 
}; 

Вы также можете сделать следующее, хотя это часто считаются не быть лучшей практикой, как это излишне вводит переменных в область. Тем не менее, если вы находитесь в такой среде ES3, и где вы не можете использовать регулировочные прокладки, чтобы добавлять новые функции ES5, следующие будут работать:

function BooleanAssoc(keyNames) { 
    var self = this; 
    this.assoc = {}; 

    $.each(keyNames, function(i, val) { 
    self.assoc[val] = false; 
    }); 
}; 
0

Это должно работать:

function BooleanAssoc(keyNames) { 
    this.assoc = {}; 
    $.each(keyNames, function(i, val) { 
     this.assoc[val] = false; 
    }.bind(this)); 
}; 
0

Я думаю, что это проблема с контекстом. Внутри каждого this указано текущее значение, а не контекст класса BooleanAssoc.

function BooleanAssoc(keyNames) { 
    var self = this; 
    self.assoc = {}; 
    $.each(keyNames, function(i, val) { 
     self.assoc[val] = false; 
    }); 
}; 

Попробуйте вместо одного вместо этого.

Смежные вопросы