原型在jQuery源代码中的含义是什么?

时间:2012-10-30 13:40:50

标签: javascript jquery

例如,从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上面片段中的用法。

是否有描述原型的规范文件?

感谢。

1 个答案:

答案 0 :(得分:56)

所有对象都具有prototype属性。它只是一个对象,其他对象可以从该对象继承属性。您发布的代码段只是将一个属性(例如init)的对象分配给prototype的{​​{1}},并将jQuery别名分配给jQuery.prototype,因为{ {1}}更短,更快捷。如果你暂时忘记了jQuery,请考虑这个简单的例子:

jQuery.fn

在此示例中,fn构造函数函数。可以通过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在所有实例之间共享。因此prototype的所有实例都有一个Person方法,他们Person继承。通过将sayHello方法定义为Person.prototype的属性,我们可以节省内存。我们可以轻松地为sayHello的每个实例提供自己的方法副本(通过将其分配给构造函数内的Person.prototype),但这样做效率不高。

在jQuery中,当您调用Person方法时,您实际上是在创建this.sayHello的实例(请记住$):

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的每个实例上声明这些方法更有效。