我试图重现 jQuery (1.7.1) 的对象结构,以更好地理解它是如何工作的。我有以下代码:
(function (window, undefined) {
var document = window.document,
navigator = window.navigator,
location = window.location;
window.myclass = (function () {
var __con = function () {
return new __con.fn.init();
}
__con.fn = __con.prototype = {
'init' : function () {
return this;
},
'test' : function () {
console.log('test1');
return this;
}
}
__con.fn.init.prototype = __con.fn;
__con.test = function () {
console.log('test2');
return this;
}
return __con;
})();
})(window);
我的控制台看起来像这样:
> myclass().test();
test1
< __con.fn.__con.init
> myclass.test();
test2
< function () {
return new __con.fn.init();
}
我的困惑是 jQuery 如何能够返回一个数组并且仍然让它成为一个 jQuery 对象?从控制台执行的 jQuery 可能类似于:
> $(document.body)
[<body>…</body>]
> $(document.body).css('width');
"1263px"
事实上,我确实注意到的一件事是缺乏<
为返回对象。那么这里究竟发生了什么?我在 Google 上搜索过 jQuery 的工作原理,但没有结果。也许我只是把术语弄错了,我不确定。我似乎找不到任何详细的来源来解释这一点。
也许我的代码不完整,但到目前为止我所拥有的基本结构是我迄今为止能够提取的。如果我到目前为止所掌握的内容是错误的、不完整的或低效的,请纠正,并且无论如何请随意提供有关以下内容的良好阅读:
- JavaScript 最佳实践
- jQuery 的工作原理
- 高效的 Javascript 类
- Things all about Javascript object structures
jQuery 对象类似于数组,因此外观和行为很像数组,但实际上只是自定义对象,大致相当于 DOM 节点的集合(除了添加的功能之外)。所有类似数组的功能 - length、slice() 等 - 实际上都是手动添加到 jQuery 原型中的(为此jQuery.fn
是别名),有时通过使用 jQuery 对象作为上下文调用数组函数
slice = Array.prototype.slice,
...
slice: function() {
return this.pushStack( slice.apply( this, arguments ),
"slice", slice.call(arguments).join(",") );
},
有时从头开始编写。看着那(这带注释的代码 http://robflaherty.github.com/jquery-annotated-source/docs/01-core.html(可能对你来说是一个非常有用的资源 - 它涵盖了 v1.6.2,但我认为从那时起,除了添加 $.callbacks 之外,没有发生任何太大的变化)看看this.length
手动设置,例如
if ( selector === "body" && !context && document.body ) {
this.context = document;
this[0] = document.body;
this.selector = selector;
this.length = 1;
return this;
}
the jQuery.buildFragment()
方法也是如何构造包含较大 DOM 节点集合的 jQuery 对象的基础。
总而言之,jQuery 不使用数组,它只是看起来像使用数组,因为许多本机数组功能已被复制为 jQuery 原型的属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)