【问题标题】:How can I make an object callable as an instance and a function如何使对象可作为实例和函数调用
【发布时间】:2015-04-15 07:53:56
【问题描述】:

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

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

【问题讨论】:

    标签: javascript object window global-namespace


    【解决方案1】:

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

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

    在您的代码中,instancemyLib 是同一个东西,它们都是您创建的实例。

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

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

    【讨论】:

    • 将函数直接添加到实例中,我想将其保留在原型中
    • 我认为这是您可以同时调用$(...).putVar$.putVar 的唯一方法。你在原型中定义了putVar,你怎么能指望它直接调用$.putVar呢? $ 只是代码中myWrapper 的别名,它是一个函数。
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2020-01-10
    • 2014-12-03
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2019-02-05
    相关资源
    最近更新 更多