返回一个对象但没有使用new关键字,Javascript?

时间:2013-05-13 08:24:36

标签: javascript object

我正在尝试创建一个在javascript中没有new关键字的情况下返回的对象?

到目前为止我的代码结构;

myLib.func = (function() {

    "use strict";

    function func() {

        this._init();
    };

    func.prototype._init = function() {

        this.someVar = 5;
    };

    Return func;

})();

这显然仅在使用new关键字时才有效;

new myLib.func();

我怎样才能做到这一点,我可以做;

var func = myLib.func();

但它仍然会返回一个与第一个示例完全相同的对象吗?

我尝试了什么

myLib.func = (function() {

    "use strict";

    function func() {

        if (window === this) {
            return new myLib.func();
        } else {
            this._init();
        }
    };

    func.prototype._init = function() {

        this.someVar = 5;
    };

    Return func;

})();

这不起作用我从John Resig关于构建库的提示的幻灯片25中的示例中学到了http://ejohn.org/blog/building-a-javascript-library/

我知道已有现有框架,但滚动我自己的框架会让我学到很多东西,正如你所看到的那样,目前还不是很多!

3 个答案:

答案 0 :(得分:2)

strict mode中,this默认为undefined。您可以通过将此功能添加到您的条件中来解释此功能:

    if (window === this || undefined === this) {
        return new myLib.func();
    } else {
        this._init();
    }

或通过检查当前对象是否是构造函数的实例(使用instanceof):

    if (this instanceof func) {
        this._init();
    } else {
        return new func();
    }

(PS。您的代码中有拼写错误; JavaScript区分大小写,因此您最后应使用return代替Return

答案 1 :(得分:1)

如果myLib.func是您的班级名称,则不能将其称为var func = myLib.func();。 但是,您可以将后者包装到另一个函数中,以便获得

var factory = function(){
    var func = myLib.func();
    return func;
}

答案 2 :(得分:0)

如果您不需要公共/私人方法,则可以使用对象文字

var myLib = {}; 
myLib.func = {
     _init: function() {
         this.someVar = 5;
     },
     doSomething: function(a, b) {
        return a + b;
     }
};

这将是一个单例对象,通常它足以用于javascript applciation。如果你需要一个对象的很多实例,你将被迫在某处放置一个“new”关键字。