0

我有一个模块。我正在做的是当我func在模块内创建对象函数的新实例时,会在构造函数内自动调用。func()如果 b 为真,则返回真,否则返回假。但是,它返回对象 ie Module为什么?

var Module = function () { this.func() };

Module.prototype = function () {
    var b = true;

    func = function() {
        if (b) {
            return true;
        }
        return false;
    };

    return {
        func: func
    }
}();

console.log(new Module());

当我停止anyMobile()在构造函数中调用函数并创建新实例IsMobile然后anyMobile()像下面那样调用时,它确实返回真或假。

var m = new Module();
m.func(); //Works
4

2 回答 2

0

因为这 -

return {
        func: func
    }

要公开访问的 anyMobile 是一个object具有功能的。

如果您要这样做func: func()(这现在将是一个返回布尔值的函数调用),它应该可以工作!

在这里查看精美解释的概念

于 2013-08-23T09:37:24.370 回答
0

示例中的第一行是声明一个充当构造函数的函数。

var IsMobile = function () { this.anyMobile() };

当你调用 new IsMobile()

  1. 使用 IsMobile.prototype 创建一个新对象 OBJ 作为它的原型对象(继承 IsMobile.prototype 上定义的属性)
  2. 调用构造函数 IsMobile 并将 this 绑定到 OBJ
  3. 如果构造函数返回一个对象,则返回,否则返回OBJ

在您的情况下, anyMobile() 方法在构造函数代码中被调用,但返回值被忽略。

我建议您更改代码以不每次都创建新的 IsMobile 对象,如下所示:

IsMobile = function () {
    var android = function() {
        return navigator.userAgent.match(/Android/i);
    },

    blackBerry = function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },

    iOS = function() {
        return navigator.userAgent.match(/iPhone/i);
    },

    windows = function() {
        return navigator.userAgent.match(/IEMobile/i);
    },

    anyMobile = function() {
        if (android() || blackBerry() || iOS() || windows()) {
            return true;
        }
        return false;
    };

    return anyMobile;
}();

console.log(IsMobile());

此外,由于 navigator 对象没有改变,您可以简单地保留返回的值,而不是每次都计算它。

IsMobile = function () {
    var android = function() {
        return navigator.userAgent.match(/Android/i);
    },

    blackBerry = function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },

    iOS = function() {
        return navigator.userAgent.match(/iPhone/i);
    },

    windows = function() {
        return navigator.userAgent.match(/IEMobile/i);
    },

    anyMobile = function() {
        if (android() || blackBerry() || iOS() || windows()) {
            return true;
        }
        return false;
    };

    return anyMobile();
}();

console.log(IsMobile);
于 2013-08-23T10:39:26.097 回答