在 jQuery 库中,我找到了这一行
jQuery.extend = jQuery.fn.extend = function() {
这让我很困惑。我认为给定的对象会自动提供对其原型(prototype)方法的访问(换句话说,如果方法或 var 未在对象本身上解析,则会在其原型(prototype)上尝试,然后在原型(prototype)的原型(prototype)上尝试,依此类推)。
那么,将函数与对象和原型(prototype)相关联的原因是什么? (在 jQuery 中,fn 是原型(prototype)的别名)。
最佳答案
神奇的原型(prototype)
是构造函数的属性,而不是对象。 jQuery 实例将从原型(prototype)继承 extend
,但 jQuery 需要自己的副本。
上面说的很对,但可能会误导人。所有对象都有一个用于属性解析的内部 [[Prototype]] 属性,但它不一定可以在 Javascript 中直接访问(参见 ECMA-262 § 8.6.2 和 4.2.1)。您可以通过 obj.constructor.prototype
访问对象的原型(prototype),但它不使用 [[Prototype]] 属性,实际上是一个 little different 的东西.某些浏览器(例如 Firefox 和 Safari)支持可能是 [[Prototype]] 的非标准 __proto__
属性。由于它不是标准属性,因此用途有限。
这是来自 § 4.2.1 的插图,可以提供一点帮助:
alt text http://img121.imageshack.us/img121/3504/prototypes.png
CF 是构造函数;每个 cfi 都是从 CF 创建的。您看到的从 CF 到 Cfp 的实线箭头代表您可以在 Javascript 中访问的原型(prototype)属性。虚线箭头表示每个对象对其原型(prototype)的引用以及 Javascript 引擎使用的引用,但不向脚本公开。请注意,CF 有它自己的隐式原型(prototype)链接到 Function
。
关于关于继承和原型(prototype)的javascript问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740676/