jQuery 是个很流行的 JavaScript 库,最近研究了下,尝试写一个 jQuery 对象的简化山寨版,命名为 jsquick。
jQuery 这个对象也不简单,因此我们首先实现 $.each 和 $.extend 这两个最基本的功能。代码如下:
(function(){
var jsquick = {
each: function(collection, callback) {
var i, arr = [];
if (Object.prototype.toString.call(collection) !== "[object Array]") {
if (Object.getOwnPropertyNames) {
arr = Object.getOwnPropertyNames(collection);
} else {
for (var key in collection) {
if (collection.hasOwnProperty(key)) arr.push(key);
}
}
for (i = 0; i < arr.length; i++) {
callback(arr[i], collection[arr[i]]);
}
} else {
for (i = 0; i < collection.length; i++) {
callback(i, collection[i]);
}
}
},
extend: function(obj) {
var that = this;
this.each(obj, function(key, value) {
that[key] = value;
});
}
};
$ = window.jsquick = jsquick;
})();
接下来,我们在 $.each 和 $.extend 的基础上,继续添加 $(selector),$.fn.each 和 $.fn.extend 方法。此时 $() 既是一个函数,但是又作为对象拥有各种方法,而且 $(selector) 函数生成的对象,它的原型还是 $。因此需要对 $ 对象作一些修改。最后的代码如下:
(function(){
function jsquick(selector) {
return new init(selector);
}
function init(selector) {
var elems;
switch (selector.charAt(0)) {
case "#":
elems = [document.getElementById(selector.slice(1))];
break;
case ".":
elems = document.getElementsByClassName(selector.slice(1));
break;
default:
elems = document.getElementsByTagName(selector);
}
for (var i = 0; i < elems.length; i++) {
this[i] = elems[i];
}
this.length = elems.length;
};
init.prototype = jsquick.prototype;
jsquick.prototype.each = function(callback) {
for (var i = 0; i < this.length; i++) {
callback.call(this[i], i);
}
};
jsquick.each = function(collection, callback) {
var i, arr = [];
if (Object.prototype.toString.call(collection) !== "[object Array]") {
if (Object.getOwnPropertyNames) {
arr = Object.getOwnPropertyNames(collection);
} else {
for (var key in collection) {
if (collection.hasOwnProperty(key)) arr.push(key);
}
}
for (i = 0; i < arr.length; i++) {
callback(arr[i], collection[arr[i]]);
}
} else {
for (i = 0; i < collection.length; i++) {
callback(i, collection[i]);
}
}
};
jsquick.prototype.extend = jsquick.extend = function(obj) {
var that = this;
jsquick.each(obj, function(key, value) {
that[key] = value;
});
};
jsquick.fn = jsquick.prototype;
$ = window.jsquick = jsquick;
})();
其中,我们只简单地实现了 $("#id"),$(".class") 和 $("tag") 这三种选择器。$(selector) 创建的实际是一个对象,我们把它当成数组来使用,因此需要自己管理其中的 length 属性。
现在,jQuery 的一个简化山寨版就出来了,而且当中已经实现了扩展的功能。
参考资料:
[1] jQuery: The Write Less, Do More, JavaScript Library
[2] jQuery API Documentation
[3] jQuery() | jQuery API Documentation
[4] Types | jQuery API Documentation
[5] jQuery.each() | jQuery API Documentation
[6] jQuery.extend() | jQuery API Documentation
[7] jQuery.inArray() | jQuery API Documentation
[8] .each() | jQuery API Documentation
[9] 如何做到 jQuery-free? - 阮一峰的网络日志
[YAML] Updated: 2013-07-04 20:20:00

浙公网安备 33010602011771号