jQuery 如何表现得像对象和函数?

2024-01-28

jQuery or $似乎是一个函数:

typeof $; // "function"

它的作用就像一个:

$('div').removeClass(); // $ constructs a new object with some methods like removeClass

但是当我删除函数括号时,它的行为就像一个对象:

$.each(/* parameters */); // $ is an object with some methods like each

我想知道这是如何可能的以及如何将这种行为实现到我自己的函数中。


函数也是对象,所以$.each可以用与对象类似的方式来定义。

JavaScript is a prototypical language. For jQuery, this means that every instance of $ inherits methods from jQuery.prototype.See Notes

一个非常粗略的演示,以实现类似的行为:

(function() { // Closure to not leak local variables to the global scope
    function f(a, b) {
        //Do something
    }
    // Prototype. All properties of f.prototype are inherited by instances of f.
    // An instance of f can be obtained by:    new f, new f(), Object.create(f)
    f.prototype.removeClass = function(a) {
        return a;
    };
    function $(a, b) {
        return new f(a, b); // <--- "new f" !  
    } 
    $.each = function(a) {
        alert(a);             
    };
    window.$ = $; // Publish public methods
})();

//Tests (these do not represent jQuery methods):
$.each("Foo");                   // Alerts "Foo" (alert defined at $.each)
alert($().removeClass('Blabla'));// Alerts "Blabla"

Notes

jQuery的root方法定义如下(仅显示相关部分):

(function(win) {
    var jQuery = function (selector, context) {
        return new jQuery.fn.init(selector, context, rootjQuery);
    };
    //$.fn = jQuery.fn is a shorthand for defining "jQuery plugins".
    jQuery.fn = jQuery.prototype = {
        constructor: jQuery,
        init: function( /* ..parameters.. */ ) { 
            //.... sets default properties...
        }
        //....other methods, such as size, get, etc...
        //.... other properties, such as selector, length, etc...
    };
    jQuery.fn.removeClass = function() { // (Actually via jQuery.fn.extend)
        // ... method logic...
    };  //...lots of other stuff...

    win.$ = win.jQuery = jQuery; //Publish method
})(window);

的优点prototype方法的优点是它很容易链接方法和属性。例如:

$("body").find("div:first").addClass("foo");

实现此功能的方法可以是:

$.fn.find = function(selector) {
    ...
    return $(...);
};

如果您对 jQuery 的实际实现感兴趣,请查看带注释的源代码:

  • jQuery 核心 https://github.com/jquery/jquery/blob/master/src/core.js#L1- 构造函数和基本方法的定义。
  • jQuery.fn.extend习惯于add removeClass等到 jQuery https://github.com/jquery/jquery/blob/master/src/attributes.js#L13.
  • jQuery 1.7.1 http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery 如何表现得像对象和函数? 的相关文章

随机推荐

  • Facebook Graph API:获取带有应用 ID 和密钥的访问令牌

    https developers facebook com docs facebook login access tokens https developers facebook com docs facebook login access
  • 无法解析 React Native 项目上的模块 redux

    自从新版本的react native 0 26 0 以来 当我初始化一个新项目时 我收到了这个错误 当我 npm 安装 redux 等其他模块时 我遇到了同样的错误 然后在运行时找不到这些依赖项 还有其他人遇到这样的问题或有任何想法吗 gt
  • 借助 TypeScript 将 Angular 2 与旧版浏览器一起使用?

    由于 Angular 2 团队使用 TypeScript 进行构建 因此是否可以假设他们可以编译可在旧浏览器上运行的 Angular 2 版本 Edit 2 Angular 团队似乎已决定支持一些非常绿浏览器 Per Brad Green
  • iPhone核心位置:计算总高程损失/增益

    我想在记录核心位置数据结束时计算总海拔损失和增益 我很难思考这个问题的数学原理 假设我从 600 英尺处开始 在跟踪过程中上下移动 我将如何计算海拔增益和损失 Ideas 如果您想分别跟踪增益和损失 请保留两个累积成员变量 netEleva
  • PreferredContentSize 不缩小

    我使用 UIPopoverController 弹出窗口 我使用 PreferredContentSize 来设置大小 然后 我使用 Push 一个更大尺寸的新视图控制器 当子视图弹出时 我喜欢将窗口恢复到原始大小 但好像不行 我已经把 s
  • ZetPDF - 有人知道这个产品的背景吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 问题 ZetPDF 只是伪装的 PDFSharp 吗 这个产品会继续存在吗 ZetPDF 是谁 我们目前正在使用 PDFSharp 从头开
  • 实体框架复杂类型与创建新实体

    我正在阅读有关实体框架 4 0 的内容 我想知道为什么我应该创建一个复杂类型而不是一个新的实体 表 以及它们之间的关系 完美的例子就是地址 使用复杂类型作为地址比处理新实体要容易得多 对于复杂类型 您不必处理主键 考虑访问一个地址 有多少种
  • 仅在 Firefox 上跨源请求和混合内容

    我正在开发一个需要 HTTPS 的项目 因此我使用自签名证书启动 HTTPS 服务器 我还有一个启用了 CORS 的 HTTP API 服务器 我能够在 Chrome 上获取 API 请求 这里是预检响应的标头 带有 HTTP 状态代码 2
  • 有哪些好的 Xcode 脚本可以加快开发速度?

    Xcode 允许您创建自动化脚本来执行重复任务 您编写了哪些脚本来加快开发速度 我为我创建了三个适用于 Cocoa 和 iPhone 的 JSON Framework http code google com p json framewor
  • Eclipse 中的 JFace 示例类似于 SWT 示例?

    是否有像 Eclipse 中的 SWT 示例那样的一体化 JFace 控件示例 搜索 谷歌搜索和在 stackoverflow com 上搜索 对我没有帮助 如果它是一个独立的应用程序或 eclipse 插件 那就太好了 谢谢 除了SWT
  • 如何获取数据库序列生成的新对象ID?

    我有一个带有序列和触发器的表 因此它在将其插入数据库时 会创建新的 id 在调用 SaveChanges 之前如何获取新的对象 id 我需要这个 id 作为新对象和其他对象之间的链接 我想在调用 SaveChanges 之前执行此操作 因为
  • 带有redis存储的socket.io

    我正在将 socket io 与 redis 存储一起使用 我从 socket io 网站获取了以下代码 var io require socket io server var redis require socket io redis i
  • 如何删除以短信形式发送的“[附件已删除]”字符串?

    我发现一个小程序可以通过 gmail 向我的手机发送短信 但是当我发送短信时 它会添加 附件已删除 有什么方法可以删除它吗 import smtplib from email mime text import MIMEText from e
  • 如何使用 phpMyAdmin 在 MySQL 中指定小数精度和小数位数

    SQL 使 MySQL 用户能够以十进制格式分配具有特定精度和小数位数的字段 如下所示 CREATE TABLE test table test column DECIMAL 6 4 NOT NULL 由于字段类型只有长度 值选项可用 我该
  • MySQL Workbench EER 图 - 如何更改存储引擎?

    我使用 MySQL Workbench 5 2 38 我做了一个能效比图 但在导出时 我对 InnoDB 作为定义的存储引擎感到惊讶 之后更改表不是一个选项 因为我没有 InnoDB 引擎 错误 1286 42000 未知的存储引擎 Inn
  • 如何根据请求中的 Origin 标头将 nginx Access-Control-Allow-Origin 正确设置到响应标头中?

    我正在寻找一个 nginx 配置设置来设置Access Control Allow Origin到收到的值Origin 看来 该方法不适用于 Chrome 并且多个 URL 不适用于 Firefox 因为 CORS 规范不允许这样做 到目前
  • 带有文本选择和按钮的引导输入组

    我想使用 bootstrap css 来实现 我写了一个 jsfiddle 来进行测试 http jsfiddle net xr4uofje http jsfiddle net xr4uofje div class container di
  • 如何在 LINQ 中通过索引连接两个集合

    与以下代码等效的 LINQ 是什么 string values 1 hello true Type types typeof int typeof string typeof bool object objects new object v
  • flutter 中的流布局示例

    我想在flutter中实现流布局我在sdk中找到了一个名为FLOW的类 但无法找到如何使用它的示例代码 这是我想要实现的布局 Use Wrap https docs flutter io flutter widgets Wrap class
  • jQuery 如何表现得像对象和函数?

    jQuery or 似乎是一个函数 typeof function 它的作用就像一个 div removeClass constructs a new object with some methods like removeClass 但是