例如,从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上面片段中的用法。
是否有描述原型的规范文件?
感谢。
答案 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
的每个实例上声明这些方法更有效。