JavaScript: объектно-ориентированная функция не существует (не является функцией) - PullRequest
1 голос
/ 04 марта 2012

Я пишу небольшой класс, и я не понимаю, почему это не работает:

var Browsertest = {

    isIE: /MSIE (\d+\.\d+)/.test(this.getUserAgent()),

    getUserAgent: function() {
        return navigator.userAgent;
    }

};

console.log(Browsertest.isIE);

Я получаю сообщение об ошибке, что getUserAgent() не существует / недоступен (в IE9 и других браузерах).

Ответы [ 4 ]

4 голосов
/ 04 марта 2012

Поскольку isIE определяется как свойство до getUserAgent(), вы должны определить его как функцию, а не скаляр:

var Browsertest = {

    isIE: function() {
      return /MSIE (\d+\.\d+)/.test(this.getUserAgent());
    },
    getUserAgent: function() {
        return navigator.userAgent;
    }
};
// Call it as a function
console.log(Browsertest.isIE());
4 голосов
/ 04 марта 2012

Вы вызываете функцию getUserAgent до ее определения.При использовании object literals элементы экземпляра должны быть определены до их использования.

Два варианта ...

Один:

var Browsertest = {
    getUserAgent: function() {
        return navigator.userAgent;
    },

    isIE: function() { return /MSIE (\d+\.\d+)/.test(this.getUserAgent()); }
};

console.log(Browsertest.isIE());

Два:

var Browsertest = new function() {
    var that = this;

    this.getUserAgent = function() {
        return navigator.userAgent;
    };

    this.isIE = /MSIE (\d+\.\d+)/.test(that.getUserAgent());
};

console.log(Browsertest.isIE);
1 голос
/ 04 марта 2012

Вы звоните this.getUserAgent в место, где this разрешается в глобальный объект.

0 голосов
/ 04 марта 2012

Ну, во-первых, я хотел бы отметить, пожалуйста, больше не пользуйтесь пользовательским агентом, сниффингом, в наши дни это вызывает неодобрение. См. Эту ссылку для получения дополнительной информации, почему UA нюхает плохо

Ответ на ваш вопрос: Это будет работать, если вы объявите метод getUserAgent перед методом isIE.

var Browsertest = {
    getUserAgent: function() {
        return navigator.userAgent;
    },

    isIE: /MSIE (\d+\.\d+)/.test(this.getUserAgent())
};

Это потому что:

/MSIE (\d+\.\d+)/.test(this.getUserAgent())

Сразу же выполняется при разборе, потому что это выражение, а не объявление функции. Поэтому он не знает о getUserAgent, потому что этот метод просто еще не проанализирован.

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

var Browsertest = {
    isIE: /MSIE (\d+\.\d+)/.test(navigator.userAgent)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...