如何将对象作为实例和函数进行调用

时间:2015-02-14 08:09:18

标签: javascript object window global-namespace

我正在构建一个包装器中的原型辅助方法集合。但是为了便于使用,我希望能够在同一个调用下将对象称为新实例和单个全局实例。

例如,使用jQuery,您可以调用“$”和“$()”,它们的使用方式可以不同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/

1 个答案:

答案 0 :(得分:0)

如果您想致电$.putVar,则应定义putVar,如下所示:

myWrapper.putVar = function (foo) {
    console.log('Work');
}

在您的代码中,instancemyLib是相同的,它们都是由您创建的实例。

如果您要同时拨打$.putVar$(...).putVar,则应添加我在上面显示的代码。这意味着您必须定义两个putVar函数,一个像'实例'方法一样使用,而另一个像'静态'方法一样使用。

如果您搜索jQuery源代码,您将看到定义了两个each函数。这就是为什么你可以同时$.each(...)$(...).each用于不同的用途。