jQuery / $如何成为函数和'原型根'

时间:2012-09-01 11:02:51

标签: javascript jquery prototype

这很难解释,所以我欢迎评论查询细节。基本上使用jQuery,您可以执行以下操作:

我想要什么

$.ajax().etc()
$("selector").doStuff().etc()

这意味着$充当一个函数(然后是可链接的)以及一个对象(也是可链接的)。

我得到了什么

我自己写了一些javascript,并成功地创建了一组可链接的函数:

myF.func1().func2()
myF('text') //Cannot get this working!

我正在使用window.myF=(new myFuncs())来使第一行工作,但我不能将myF用作函数。我也做了这个,以便myF可以用作函数,但是我不能链接其他函数。

我非常困惑,尽管我尝试搜索这个网站和谷歌,我一定是在寻找错误的东西,因为我不知道从哪里开始!

评论中的问题受到欢迎和期待!

我的设置(简化)

(function(){
    var myFuncs=function(){

    };

    myFuncs.prototype = {
          foo: function() {
          }
          ,bar: function() {
          }
    }

    window.myF = (new myFuncs());
})();

3 个答案:

答案 0 :(得分:3)

让你的myF成为一个功能。 jQuery对象上的 static 方法只是直接分配给该函数。

(function(exports) {

    exports.myF = function() {
        // This function can return an instance of itself, to make
        // it chainable.
    };

    exports.myF.staticFunction = function() {
        // This is a *static* function, available directly on `myF`
        // in the global space.
    };

})(this);

答案 1 :(得分:3)

我快速浏览了jQuery源代码,看起来它没有使用jQuery对象的原型 - window.$

相反,它使用$.extend

var myF = function(){};
$.extend(myF, {
   actAsAnObject: function(){}
});

然而,对于我将称之为jQuery响应对象的内容,它确实使用了原型。因此,如果您致电myF(),则此代码会运行:

var myF = function(){
    return new myF.prototype.init(arguments); // based on the jQuery code
};

$.post是一个对象属性,如果你调用函数本身就无法得到它。 $().html是一个jQuery响应对象函数,它不是window.$对象的成员。


回答您的更新:http://jsfiddle.net/rmpW8/

(function(){
    var myFuncExternal = function(num){
        return new myFunc(num);           
    };
    var myFunc = function(num){
        this.num = num;
    };

    $.extend(myFuncExternal, {
        foo: function(num){
            console.log("In foo with: " + num);
        }
    })

    myFunc.prototype = {
          foo: function() {
              myFuncExternal.foo(this.num);
          },
          bar: function() {
              console.log("In bar with: " + this.num)
          }
    }

    window.myF = myFuncExternal;
})();

答案 2 :(得分:2)

你会做这样的事情:

myF = function () {
  ...
}
myF.method1 = function (){
  ...
}
myF.method2 = function (){
  ...
}
...

在Javascript中,您必须记住, ANY 数据本身可以具有属性,即使它不是“对象”。所以字符串,数字,函数,所有这些都可以(并且确实)具有属性。例如,字符串具有属性length