我正在包装器中构建一个原型助手方法的集合。然而,为了便于使用,我希望能够在同一调用下将对象作为新实例和单个全局实例进行调用。
例如,使用jQuery,您可以同时调用"$"one_answers"$()",这两个词的用法可以不同http://learn.jquery.com/using-jquery-core/dollar-object-vs-function/:
所以,举下面这个简单的例子,我怎么能做类似的事情呢?
(function () {
var myWrapper = function (foo) {
return new helper(foo);
};
var helper = function (foo) {
this[0] = foo;
return this;
}
helper.prototype = {
putVar: function(foo) {
this[0] = foo;
}
}
if(!window.$) {
window.$ = myWrapper;
}
})();
// create an new instace;
var instance = $("bar");
console.log(instance);
// call a prototype method
instance.putVar("foo");
console.log(instance);
// call a prototype method using the same call without new instance
// this doesnt work :(
$.putVar("foo");
// however this will work
window.myLib = $("foo");
myLib.putVar("bar");
http://jsfiddle.net/2ywsunb4/
如果你想调用$.putVar
,你应该这样定义putVar
:
myWrapper.putVar = function (foo) {
console.log('Work');
}
在您的代码中,instance
和myLib
是相同的,它们都是您创建的实例。
如果您想同时调用$.putVar
和$(...).putVar
,您应该添加我上面向您展示的代码。这意味着您必须定义两个putVar
函数,一个像"instance"方法一样使用,而另一个则像"static"方法那样使用。
如果您搜索jQuery源代码,您将看到定义了两个each
函数。这就是为什么$.each(...)
和$(...).each
都可以用于不同用途的原因。