开发者

javascript question on inheritance and prototypes

In the jQuery library, I found this line

jQuery.extend = jQuery.fn.extend = function() {

This kind of puzzles me. I thought that a given object automatically provides access to its prototype methods (in other words, if a method, or var, is not resolved on the objec开发者_如何学Pythont itself, it is tried on its prototype, then on the prototype's prototype and so on).

So, what's the reason behind associating the function both to the object and to the prototype? (in jQuery fn is an alias for prototype).


The magical prototype is a property of constructors, not objects. An instance of jQuery would inherit extend from the prototype, but jQuery needs its own copy.

The above is quite true, but perhaps misleading. All objects have an internal [[Prototype]] property that's used for property resolution, but it's not necessarily directly accessible within Javascript (see ECMA-262 § 8.6.2 an 4.2.1). You can access the prototype of an object via obj.constructor.prototype, but that doesn't use the [[Prototype]] property and is, in fact, something a little different. Some browsers (e.g. Firefox and Safari) support the non-standard __proto__ property that is probably [[Prototype]]. Since it's not a standard property, it's of limited usefulness.

Here's an illustration of from § 4.2.1 to help a little:

alt text http://img121.imageshack.us/img121/3504/prototypes.png

CF is a constructor; each cfi is created from CF. The solid arrow you see from CF to Cfp represents the prototype property you can access in Javascript. The dotted arrows represent references that each object has to its prototype and that the Javascript engine uses, but doesn't expose to scripts. Note that CF has its own implicit prototype link to Function.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜