【问题标题】:How is jQuery's $ a function and an object?jQuery 的 $ 是一个函数还是一个对象?
【发布时间】:2011-08-28 20:09:58
【问题描述】:

我的意思是 {} [object Object] 中的对象。 $(selector)$.fn.init是怎么同时做的?

你能给我一个简单的例子吗?

【问题讨论】:

  • 那么它是如何作为一个对象工作的呢?
  • @David 因为在 JavaScript 中函数是对象:)。您可以将函数视为高级对象 - 它们可以做常规对象可以做的所有事情,但它们还有一些额外的功能......
  • 这就是函数式编程的重点。您可以将函数作为参数传递,将它们作为参数返回,等等。它们必须是对象。

标签: javascript jquery


【解决方案1】:

这不是 jQuery 独有的,而是 javascript 的一个方面。所有函数都是对象。例如:

var f = function() { alert('yo'); }
f.foo = "bar";

alert(f.foo); // alerts "bar"
f();          // alerts "yo"

【讨论】:

    【解决方案2】:

    $ 是一个函数。 $ 的方法可以返回任何东西。

    例如:

    $ = function() {
         return {
                     foo : function() { return 'baa'; },
                     r1: 1,
                     r2 : 'string'
                }
    };
    
    typeof $ <- function 
    typeof $() <- object
    typeof $().foo <- function 
    typeof $().foo() <- string
    typeof $().r1; <- number 
    typeof $().r2 <- string
    

    【讨论】:

    • 这应该是答案,嗯,我认为它需要一点解释,但玩了一段时间后我明白了,谢谢你帮了我很多!
    【解决方案3】:

    Javascript 是一种面向对象的语言,所以函数就是对象,只是你可以调用的花哨的对象。

    foo = function() { console.log("foo") }
    foo.bar = function() { console.log("bar") }
    foo() //=> prints "foo"
    foo.bar() //=> prints "bar"
    

    【讨论】:

    • 这应该是“一种面向对象的函数式语言”,因为单独面向对象并不意味着函数是一流的。
    【解决方案4】:

    jQuery$ 是一个函数(你知道$jQuery 的别名)。

    // Define a local copy of jQuery
    jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );
    },
    

    在 Javascript 中,一切都是对象,即使 function 也是如此。因此,您可以直接向函数添加属性。

       jQuery.find = function () {
       }
    

    【讨论】:

      【解决方案5】:

      人们玩弄 javascript 函数,它导致了有趣的设计模式。Jquery 使用了许多这些模式并为许多函数创建了一个很好的包装器。所以最终 jquery 就像一个静态类,使用它可以做得非常整洁东西..

      像所有类一样,它有一个名称,默认名称是 jQuery。 $ 没有什么可以购买绑定到 jQuery 库的标识符,并阻止您输入“jQuery”作为标识符。

      它是一个 $ 符号的事实是任意的。在某个时候决定使用 $ 符号,但事实是它几乎可以是任何类型的 ECMAScript 可接受的标识符。

      我们使用 $ 作为标识符的主要原因是您在键入一个字符而不是字符串时不太可能犯简单的拼写错误。

      希望这能让事情变得清晰..如果我有什么问题,请纠正我

      说我自己的库的一个简单例子是计算器类

      var Calculator= (function()
      {
      
          function add(a,b)
          {
           return a+b;
          }
          function subtract(a,b)
          {
           return a-b;
          }
          function multiply()
          {
           return a*b;
          }
          function log()
          {
            console.log("log 123")
          }
          return
          {
           add: add,
           subtract: subtract,
           multiply: multiply
          }
      }());
      

      现在我可以使用 Calculator 类执行如下操作:

      Calculator.multiply(Calculator.add(2,3),5);
      

      添加我的本地函数是私有的,不会暴露在外部使用。在这种情况下,无法使用 Calculator.log 访问我的日志函数,它会说在对象上找不到方法。

      现在回到你的问题,你可以这样做:

      var _=计算器;

      现在使用 calc 函数,例如

      _.multiply(_.add(2,3),5);
      

      有趣的是,还有一个名为 underscore 的库..

      【讨论】:

        【解决方案6】:

        它是一个对象。

        $ 拥有不同的功能。

        您可以通过制作自己的对象来自己测试:

        var $ = {
             select: function(id){return document.getElementById(id);}
        }
        
        function $(id){
              return $.select(id);
        }
        

        【讨论】:

        • 这对我不起作用。当我尝试它时它返回“对象不是函数”——jsfiddle.net/Ew2Dx
        【解决方案7】:
        var q=function(){};
        
        var s = function(){
            alert("base");
            window.s = s;
            return new q()};
        
        q.fn = q.prototype = {};
        
        q.fn.x = s.x = function(){alert("x");return this;};
        q.fn.y = s.y = function(){alert("y");return this;};
        q.fn.z = s.z = function(){alert("z");return this;};
        
        s().y().z().x();
        s.z().x().y();
        

        【讨论】:

        【解决方案8】:
        var s = function(){};
        s.test = function(){console.log('inside s');}
        s.test();
        

        是完全合法的代码。

        【讨论】:

        • 如果你想做这样的事情,为什么不直接使用一个单独的对象呢?
        • @David 为什么要两个对象,如果你只能有一个对象,然后同时做$( ... )$.foo( ... )
        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-07-31
        • 2015-07-15
        • 2011-06-24
        • 2011-04-27
        • 2011-03-27
        相关资源
        最近更新 更多