【问题标题】:What does prototype mean here in the jQuery source code?原型在 jQuery 源代码中是什么意思?
【发布时间】:2012-10-30 13:40:50
【问题描述】:

作为一个例子,从 jQuery 1.2.6 复制过来的:

jQuery.fn = jQuery.prototype = {
    init: function( selector, context ) {
        // Make sure that a selection was provided
        selector = selector || document;
        ..........
    },
};

我在这里阅读了一些帖子,例如JavaScript: What are .extend and .prototype used for?,并且知道可以在子类中使用原型来扩展某些方法。

但我无法理解上述 jQuery 中 sn-p 中的用法。

是否有任何描述原型的规范文档?

谢谢。

【问题讨论】:

  • 查看标签信息参考。我特别建议您使用 Eloquent JavaScript 的 this article 和 ECMAScript 语言规范的 this one

标签: javascript jquery


【解决方案1】:

所有对象都有一个prototype 属性。它只是一个对象,其他对象可以从中继承属性。您发布的 sn-p 只是将具有某些属性(例如 init)的对象分配给 jQueryprototype,并将 jQuery.prototype 别名为 jQuery.fn,因为 fn 更短且键入速度更快.如果您暂时忘记了 jQuery,请考虑以下简单示例:

function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function () {
    alert(this.name + " says hello");
};

var james = new Person("James");
james.sayHello(); // Alerts "James says hello"

在本例中,Person 是一个构造函数。可以通过使用new 运算符调用它来实例化。在构造函数内部,this 关键字引用实例,因此每个实例都有自己的name 属性。

Personprototype 在所有实例之间共享。所以Person 的所有实例都有一个sayHello 方法,它们从Person.prototype继承。通过将sayHello 方法定义为Person.prototype 的属性,我们可以节省内存。我们可以很容易地为Person 的每个实例提供它自己的方法副本(通过在构造函数中将其分配给this.sayHello),但这并不那么有效。

在 jQuery 中,当您调用 $ 方法时,您实际上是在创建 jQuery.prototype.init 的实例(请记住 jQuery.fn === jQuery.prototype):

return new jQuery.fn.init(selector, context, rootjQuery);

如果你看看jQuery.fn.init:

jQuery.fn.init.prototype = jQuery.fn;

实际上,您正在创建jQuery 的一个实例,它可以访问jQuery.prototype 上声明的所有方法。如前所述,这比在jQuery 的每个实例上声明这些方法要高效得多。

【讨论】:

  • jQuery.fn只是一个名字吗?和所谓的namespace有关系吗?
  • fnjQuery 对象的一个​​属性(就像prototype 只是jQuery 对象的一个​​属性一样)。 fn 属性和prototype 属性的值都是对单个对象的引用。
  • 谢谢! jQuery.fn.init.prototype = jQuery.fn; 是干什么用的?
  • @liamxu - 不客气 :) 该行导致jQuery.fn.init 继承声明为jQuery.fn 属性的所有方法。因此,当您获得jQuery.fn.init 的实例(这是您通过调用jQuery 获得的)时,它可以访问您所期望的所有常用jQuery 方法。这有意义吗?
  • jQuery.fn.init 是一个类(就 JavaScript 中的“类”而言)。当您使用new 运算符调用它时,它会创建一个jQuery.fn.init 的新实例。比较混乱,因为jQuery.fn.init.prototype就是jQuery.fn,所以有无限循环引用。
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2013-06-06
  • 2012-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多