2015-10-27 4 views
1

Мне любопытно, как я получаю ошибку «неопределенное не является функцией». Рассмотрим следующий класс:Могут ли статические методы в javascript вызвать не статические

var FlareError = require('../flare_error.js'); 

class Currency { 

    constructor() { 
    this._currencyStore = []; 
    } 

    static store(currency) { 
    for (var key in currency) { 
     if (currency.hasOwnProperty(key) && currency[key] !== "") { 

     if (Object.keys(JSON.parse(currency[key])).length > 0) { 
      var currencyObject = JSON.parse(currency[key]); 
      this.currencyValidator(currencyObject); 

      currencyObject["current_amount"] = 0; 

      this._currencyStore.push(currencyObject); 
     } 
     } 
    } 
    } 

    currencyValidator(currencyJson) { 
    if (!currencyJson.hasOwnProperty('name')) { 
     FlareError.error('Currency must have a name attribute in the json.'); 
    } 

    if (!currencyJson.hasOwnProperty('description')) { 
     FlareError.error('Currency must have a description attribute in the json.'); 
    } 

    if (!currencyJson.hasOwnProperty('icon')) { 
     FlareError.error('Currency must have a icon attribute in the json.'); 
    } 
    } 

    static getCurrencyStore() { 
    return this._currencyStore; 
    } 

}; 

module.exports = Currency; 

Рефакторинг в сторону, этот вопрос находится на линии: this.currencyValidator(currencyObject); я получаю ошибку «неопределенные не является функцией»

Я предполагаю, что это потому, что у меня есть статический метод Кто в Internals вызвать нестационарный метод? Будет ли этот статический метод статическим? и если так действует концепция this.methodName?

+2

Интересно, почему вы решили сделать 'store' static, потому что кажется, что вы не знаете, что означает' static'. – zeroflagL

+0

Конечно, статический метод может вызывать нестатический один *, если у него есть экземпляр для его вызова *. Где ваш экземпляр? – Bergi

ответ

6

Нет, статический метод не может вызвать нестатический метод.

Считаете, что у вас есть объекты a и b, оба экземпляра Currency. currencyValidator существует на этих двух объектах. Теперь store() относится к классу Currency, а не к одному из этих объектов. Итак, в Currency.store(), как он узнает, какой объект для вызова currencyValidator()? Простой ответ: это не так, как нельзя. Это одна из ловушек использования статических методов и одна из причин, по которым люди часто требуют от них.

Независимо от этого, вы можете обойти это, пройдя a в Currency.store() и позвонив по телефону a.currencyValidator().

+1

"* одна из причин, по которым люди часто призывают их. *" ??? лол – Bergi

1

Не имеет смысла вызывать нестационарную функцию из статической, на любом языке. Статический (в этом контексте) означает, что он в основном вне объекта, независимо от всех, кроме имени. Он не привязан к какому-либо экземпляру и, следовательно, нет или self для вызова нестатических (то есть элементов) полей.

+0

... за исключением случаев, когда статический метод получает один (или более) экземпляр (ы) в качестве аргумента; или когда он сам создает экземпляр. Конечно, 'this' действительно относится к самому классу. – Bergi

+0

Я не вижу, как это «исключение», у него все еще нет «этого». – Blindy

+0

«... кроме» должно было закончить первое предложение о «смысле». Вы не можете вызвать методы экземпляра из статического, используя 'this', но вам может и не понадобиться' this'. – Bergi

1

Нет, в общем, статические методы не могут вызывать методы экземпляра. Не имеет смысла это делать.

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

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