實現的功能:
1: 命名空間$, zKeter的分離
2: 無 new 構造對象
3: 選擇器的實現
4: 擴展函數的實現
5: 鏈式調用的實現
;(function(win,undefined){
var document = window.document,
navigator = window.navigator,
location = window.location;
var zKeter,
init,
arr = [],
classTools = {};
var slice = arr.slice,
concat = arr.concat,
push = arr.push,
indexOf = arr.indexOf,
toString = classTools.toString,
hasOwn = classTools.hasOwnProperty;
zKeter = function(selector,context){
return new zKeter.fn.init(selector);
};
zKeter.fn = zKeter.prototype = {
version : "0.1.0",
constructor: zKeter,
ready : function(fn){
if(document.addEventListener) {
document.addEventListener('DOMContentLoaded', function() {
document.removeEventListener('DOMContentLoaded',arguments.callee, false);
fn();
}, false);
}
else if(document.attachEvent) {
document.attachEvent('onreadystatechange', function() {
if(document.readyState == 'complete') {
document.detachEvent('onreadystatechange', arguments.callee);
fn();
}
});
if(document.documentElement.doScroll && typeof window.frameElement === "undefined") {
try{
document.documentElement.doScroll('left');
}
catch(error){
return setTimeout(arguments.callee, 20);
};
fn();
}
}
return this;
}
};
init = zKeter.fn.init = function(selector) {
var elem,
length;
if(!selector){
return this;
}
if(typeof selector === "string"){
if(selector.indexOf('.') > -1){
elem = document.querySelectorAll(selector);
for(var i=0,len=elem.length;i<len;i++){
this[i] = elem[i];
}
length = len;
}
else if(selector.indexOf('#') > -1){
elem = document.querySelector(selector);
this[0] = elem;
length = 1;
}
else{
elem = document.querySelectorAll(selector);
for(var i=0,len=elem.length;i<len;i++){
this[i] = elem[i];
}
length = len;
}
}
else if(selector.nodeType){
elem = selector;
length = 1;
}
this.length = length;
this.context = document;
this.selector = selector;
return this;
}
init.prototype = zKeter.fn;
zKeter.extend = zKeter.fn.extend = function() {
var key,
target = this,
source = arguments[0] || {};
for (key in source) {
if (hasOwn.call(source,key)) {
if (typeof(source[key]) === "object") {
target[key] = (source[key].constructor === Array) ? [] : {};
arguments.callee(source[key], target[key]);
} else {
target[key] = source[key];
}
}
}
return target;
};
zKeter.extend({
});
zKeter.fn.extend({
});
window.zKeter = window.$$ = zKeter;
}(window));
分析圖:
[源碼分析圖]
測試代碼如下:
console.dir($$("#btn"));
console.dir($$("#btn"));
console.dir($$(".btn"));
console.dir($$("li"));
zKeter.extend({
speak : function(){
console.log("說話")
return this;
},
drink : function(){
console.log("喝水")
return this;
}
});
zKeter.fn.extend({
swimming : function(){
console.log("游泳")
return this;
},
run : function(){
console.log("跑步")
return this;
}
});
$$.speak().drink();
$$("#btn").swimming().run();
$$(document).ready(function(){
console.log("hello world");
});