36

例如,从 jQuery 1.2.6 复制:

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

我在这里读过一些文章,例如JavaScript:.extend 和 .prototype 用于什么?并且知道可以在子类中使用原型来扩展某些方法。

但我无法理解上述 jQuery 片段中的用法。

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

谢谢。

4

1 回答 1

61

所有对象都有一个prototype属性。它只是一个对象,其他对象可以从中继承属性。您发布的代码段只是将具有某些属性(例如init)的对象分配给prototypeof jQuery,并且别名jQuery.prototypetojQuery.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属性。

prototypeof在Person所有实例之间共享。所以所有的实例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.

于 2012-10-30T14:01:25.903 回答