所有对象都有一个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.