这是我根据司徒正美《JavaScript框架设计》一书然后百度了很多东西之后自己写的一个JS框架,满足了司徒正美文中的种子模块部分,包含了命名空间、对象扩展、数组化、类型判断、选择器、多库并存,在异步加载中使用了CMD规范的seaJs,这个框架一年前就已经写了,之后一直在研究其他东西,没有进行扩展,今天把它发布出来也是为了时刻提醒自己,以后一定要继续扩展它。

下面是代码:

//立即执行的函数表达式
(function(){
//定义全局变量_$存储window.$
var window = this,
_$ = window.$,
_Amy = window._Amy,
DOC = document,
W3C = DOC.dispatchEvent, //判断浏览器
html = DOC.documentElement, //HTML元素
head = DOC.head, //head元素
rword = /[^,]+/g, //匹配除 ","以外的东西
class2type = {
"[object HTMLDocument]":"Document",
"[object HTMLCollection]":"NodeList",
"[object StaticNodeList]":"NodeList",
"[object DOMWindow]":"Window",
"[object global]":"Window",
"null":"Null",
"NaN":"NaN",
"undefined":"Undefined"
},
toString = class2type.toString(); "Boolean,Number,String,Function,Array,Da,RegExp,Window,Document,Arguments,NodeList"
.replace(rword,function(name){
class2type["[object " + name+"]"] = name;
}); Amy = window.Amy = window.$ = function(selector){
return new Amy.fn.init(selector);
}; //选择器初始化querySelector
Amy.fn = Amy.prototype = {
init:function(selector){
var dom = document.querySelector(selector);
return dom;
}
}; Amy.fn.init.prototype = Amy.fn; //对象扩展(原型方法)
Amy.extend = Amy.fn.extend = function(obj,prop){
if(!prop){
prop = obj;
obj = this;
}
for(var attr in prop){
obj[attr] = prop[attr];
}
}; Amy.extend({
html : html,
head :head, /**
* 多库并存问题
*/
noConflict:function(deep){
window.$ = _$;
if(deep)
window.Amy = _Amy; return Amy;
},
bindThis:function(obj){
var me = this;
var arg = [].slice.call(arguments,1);
return function(){
me.apply(obj,arg);
}
},
/**
* 运行所有参数,返回运行成功的函数返回值
*/
these:function(){
var returnVal = null;
for(var i = 0,len = arguments.length;i<len;i++){
var lambda = arguments[i];
try{
returnVal = lambda();
}catch(e){}
}
return returnVal;
},
/**
* 根据浏览器获取ajax对象
*/
ajax:function(){
return this.these(
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
function() {return new XMLHttpRequest()}
) || false;
},
/**
*数组化
*/
toArray:function(){
return [].slice.call(arguments);
},
/**
* 数组去重
*/
noRepeat:function(target){
var result = {};
target.forEach(function(item){
result[item] = item;
});
return Object.keys(result).map(function(item){
return item | 0;
});
},
/**
* 获取多个Id
* @returns {*}
*/
list:function(){
var result = [];
for(var i = 0,len =arguments.length;i<len;i++){
var element = arguments[i];
if(typeof element == "string"){
element = $(element);
}
if(len == 1)
return element;
else
result.push(element);
}
return result;
},
repeat:(function(){
var join = Array.prototype.join,
obj = {};
return function(target,n){
obj.length = n + 1;
return join.call(obj,target);
};
})(),
/**
* 事件绑定
*/
bind:W3C?function(el,type,fn,bool){
el.addEventListener(type,fn || $.noop,!!bool);
return fn;
} : function(el,type,fn){
el.attachEvent("on"+type,fn || $.noop);
return fn;
},
/**
* 解绑事件
*/
unbind:W3C?function(el,type,fn,bool){
el.removeEventListener(type,fn,!!bool);
} : function(el,type,fn){
el.detachEvent("on"+type,fn);
},
/**
* 用于取得数据的类型(一个参数的情况下)或判定数据的类型(两个参数的情况下)
* @param {Any} obj 要检测的东西
* @param {String} str ? 要比较的类型
* @return {String|Boolean}
* @api public
*/
type:function(obj,str){
var result = class2type[(obj != obj || obj == null)?obj:Object.prototype.toString.call(obj)] || obj.nodeName || "#"; if(result.charAt(0) === "#"){
if(obj == obj.document && obj.document != obj){
result = "Window";
}else if(obj.nodeType === 9){
result = 'Document';
}else if(obj.callee){
result = "Arguments";
}else if(isFinite(obj.length) && obj.item){
result = "NodeList";
}else{
result = Object.prototype.toString.call(obj).slice(8,-1);
}
}
if(str){
return str === result;
}
return result;
},
noop:function(){ },
//字符串操作 /**
* 字符串所占字节数
*/
btyeLen:function(target){
var byteLength = target.length;
for(var i = 0,len = target.length;i<len;i++){
if(target.charCodeAt(i) > 255) //若为中文则加1
byteLength++;
}
return byteLength;
},
/**
*字符串截取,当超过限定时默认添加三个...
*/
truncate : function(target,length,text){
length = length || 30;
text = text === void 0?"...":text;
return target.length > length?
target.slice(0,length - text.length) + text:String(target);
},
capitalize:function(target){
return target.charAt(0).toUpperCase() + target.slice(1).toLowerCase();
},
/**
* 去除字符串开头和结尾空格
*/
trim : function(str){
return str.replace(/^\s+|\s+$/g,"");
}, //数组操作
/**
* 判断目标中是否包含一个数(数组或字符串)
*/
contains : function(target,index){
return target.indexOf(index) > -1;
},
/**
* 删除目标(数组)指定位置的一个数(返回bool)
*/
removeAt:function(target,index){
return !!target.splice(index,1).length;
},
/**
*删除目标(数组)中第一次出现的数
*/
remove:function(target,item){
var index = target.indexOf(item);
if(index > -1){
return !!target.splice(index,1);
}
return false;
},
/**
* 从目标(数组)随机抽取一个数
*/
random:function(target){
return target[(Math.random()*target.length)|0];
},
/**
* 数组平坦化操作
* 命名函数表达式,fla只在函数内有定义,这里用递归
*/
flatten:function fla(target){
var result = [];
target.forEach(function(item){
if(Array.isArray(item)){
result = result.concat(fla(item));
}else{
result.push(item);
}
});
return result;
},
/**
* 删除数组中null和undefined
* 利用filter过滤操作 //返回true值
*/
compact:function(target){
var result = target.filter(function(item){
return item != null;
});
return result;
},
max:function(target){
return Math.max.apply(0, target);
},
min:function(target){
return Math.min.apply(0,target);
},
//数值扩展
/**
* 确保数值在[n1,n2]之间
*/
limit:function(target,n1,n2){
var arr = [n1,n2].sort();
if(target < arr[0]){
target = arr[0];
}
if(target > arr[1]){
target = arr[1];
}
return target;
},
iterator:function iter(n,type){
if(typeof type == "undefined" || type == "*"){
return n==0 ? 1:n*iter(n-1);
}else if(type == "+"){
return n==0 ? 1:n+iter(n-1);
}
},
/**
* 求距离目标最近的数
*/
near : function(target,n1,n2){
var diff1 = Math.abs(target - n1),
diff2 = Math.abs(target - n2);
return diff1 < diff2?n1:n2;
},
/**
* 复制数组
* 一般不希望别人访问原数组进行修改
*/
clone:function(target){
if(this.type(target) == "Array"){
var arr = new Array(target.length);
for(var i = 0,len = target.length;i<len;i++){
arr[i] = target[i];
}
return arr;
}else{
return 0;
}
} });
})();

自己的JS框架--Amy框架。的更多相关文章

  1. 转 10 个最佳的 Node.js 的 MVC 框架

    10 个最佳的 Node.js 的 MVC 框架 oschina 发布于: 2014年02月24日 (33评) 分享到:    收藏 +322 Node.js 是一个基于Chrome JavaScri ...

  2. Hexo - 快速,轻量,强大的 Node.js 博客框架

    Hexo 是一个快速,轻量,强大的 Node.js 博客框架.带给你难以置信的编译速度,瞬间生成静态文件:支持 Markdown,甚至可以在 Hexo 中集合 Octopress 插件:只需要一个命令 ...

  3. node.js Web应用框架Express.js(一)

    什么是Express.js Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随 ...

  4. 使用 Require.js 引用第三方框架时遇到的一些情况

    使用 Require.js 引用第三方框架时遇到的一些情况 在使用Require.js解析依赖的时候,会出现以下几种情况: 程序中的依赖关系 当前程序 依赖于 B包, B包 依赖于 A包 A包与B包两 ...

  5. js调用父框架函数

    if (window.parent && window.parent.frames["frame_main"]) { alert(window.parent.fra ...

  6. node.js之express框架入门篇

    一.express框架简介 express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样 英语官网:http://expressjs.com/ 中文官网:http://www.ex ...

  7. node.js使用express框架进行文件上传

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...

  8. node.js之express框架

    之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express.下面正好就跟大家介绍一下关于express.今天的内容主要围绕这么几个方面? expr ...

  9. node.js中的框架

    node.js中的框架 载自: http://nodeframework.com/ MVC frameworks Sinatra-like These frameworks offer rich co ...

随机推荐

  1. 多线程_先产后销_运行结果有BUG

    class Shop { public static void main(String[] args) { Things t=new Things(); Custom c=new Custom(t); ...

  2. Oracle Created (Default) Database Users

    http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_26.shtml DBA Tips Arch ...

  3. Nodejs学习路线图

    前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...

  4. ajax跟取后台 josn 之 josn理解

    json是一种轻量级的数据交换格式,是 JavaScript 原生格式,是理想的数据交换格式. 1.json对象json对象以“{”开始 , 以“}”结束,每个“名称”后跟一个“:”(冒号),‘名:值 ...

  5. Building Apps for Windows Phone 8.1教程下载地址整理

    官方教程地址http://channel9.msdn.com/Series/Building-Apps-for-Windows-Phone-8-1http://media.ch9.ms/ch9/8db ...

  6. 【腾讯Bugly干货分享】QFix探索之路—手Q热补丁轻量级方案

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5832bb8fec206ce2185d 导语 QFix 是手Q团队近期推 ...

  7. [.net 面向对象编程基础] (2) 关于面向对象编程

    [.net 面向对象编程基础]  (2)  关于面向对象编程 首先是,面向对象编程英文 Object-Oriented Programming 简称 OOP 通俗来说,就是 针对对象编程的意思 那么问 ...

  8. 推荐windows下的日志跟踪工具:SnakeTail

    用过Linux的同学都知道,在Linux中要实时跟踪日志文件那是非常的方便,Tail.Less都可以做到. 开启动态跟踪后,程序会监视文件修改,从而不断刷新出最新的内容,对于线上运维特别有用.   今 ...

  9. iOS——Core Animation 知识摘抄(四)

    原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的 ...

  10. STSdb,最强纯C#开源NoSQL和虚拟文件系统 4.0 RC2 支持C/S架构

    STSdb是什么 再来说明一下STSdb是什么:STSdb是C#写的开源嵌入式数据库和虚拟文件系统,支持实时索引,性能是同类产品的几倍到几十倍,访问官方网站. 温故知新 之前发了文章<STSdb ...