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