1

我正在努力在包装器内构建一组原型辅助方法。但是为了便于使用,我希望能够在同一个调用下将该对象作为新实例和单个全局实例调用。

例如,使用 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/

4

1 回答 1

0

如果你想调用$.putVar,你应该putVar这样定义:

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

在您的代码中,instanceandmyLib是相同的东西,它们都是您创建的实例。

如果你想同时调用$.putVarand $(...).putVar,你应该添加我在上面展示给你的代码。这意味着您必须定义两个putVar函数,一个用作“实例”方法,而另一个用作“静态”方法。

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

于 2015-02-14T08:30:11.990 回答