用Javascript返回一个对象但不使用new关键字?

3

我正在尝试在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个回答

2
严格模式下,默认情况下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

太棒了!非常感谢 :) 我想我会使用第二个例子,它更简洁易读!感谢指出笔误。 - user2251919
@user2251919 最后一件事,我会写成 new func(); 而不是 new myLib.func();。这样做可以使代码更具可移植性。例如,如果您决定重命名 myLib 或重新分配 myLib.func,那么代码仍将按预期运行。 - Rob W

1
如果myLib.func是你的类名,你不能像这样调用它:var func = myLib.func();。然而,你可以将后者包装到另一个函数中,这样你就会得到:
var factory = function(){
    var func = myLib.func();
    return func;
}

0
如果您不需要公共/私有方法,可以使用对象字面量。
var myLib = {}; 
myLib.func = {
     _init: function() {
         this.someVar = 5;
     },
     doSomething: function(a, b) {
        return a + b;
     }
};

这将是一个单例对象,通常对于JavaScript应用程序来说足够了。如果您需要多个对象实例,则必须在某个地方放置“new”关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接