作为示例,从 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?并且知道可以在子类中使用原型(prototype)来扩展一些方法。
但我无法理解上述 jQuery 片段中的用法。
是否有描述原型(prototype)的规范文档?
谢谢。
最佳答案
所有对象都有一个prototype
属性。它只是一个对象,其他对象可以从中继承属性。您发布的代码段只是将具有某些属性(例如 init
)的对象分配给 jQuery
的 prototype
,以及别名 jQuery .prototype
到 jQuery.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
属性。
Person
的prototype
在所有实例之间共享。所以 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
的每个实例上声明这些方法要有效得多。
关于javascript - prototype 在 jQuery 源代码中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140292/