我正在尝试创建一个在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/
我知道已有现有框架,但滚动我自己的框架会让我学到很多东西,正如你所看到的那样,目前还不是很多!
答案 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”关键字。