3

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

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

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/

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

4

3 回答 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最后)

于 2013-05-13T08:31:17.230 回答
1

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

var factory = function(){
    var func = myLib.func();
    return func;
}
于 2013-05-13T08:31:17.873 回答
0

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

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

这将是一个单例对象,通常对于 javascript 应用程序来说已经足够了。如果您需要一个对象的多个实例,您将不得不在某处放置一个“new”关键字。

于 2013-05-13T08:29:34.707 回答