这是我根据司徒正美《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. WLAN信道

  2. SQL SERVER 内存学习系列(一)

    最近帮客户解决发布订阅的问题时,突然遇到这样一个问题发布订阅中报下面的错误,另外执行alter table 操作时也会报错 : 问题很奇怪发布订阅和CLR有什么关系?memtoleave内存是个啥?回 ...

  3. Java设计模式9:代理模式

    代理模式 代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构 有些情况下,一个客户不想活着不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间 ...

  4. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  5. WPF,Silverlight与XAML读书笔记第四十八 - Silverlight网络与通讯

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 这一部分我们重点讨论下Silverlight ...

  6. 【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用

    原谅:http://www.weixq.cn/Article/Detail/906 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 using (var context = new MyDbCo ...

  7. 博客的QQ群群规

    本人博客园博客夏天的森林相关的QQ群一共有3个,它们分别是Web前端及Web开发技术群(群号:262413025).JS及Web前端技术群(群号:35079861)和Web服务端技术群(群号:3414 ...

  8. 面向对象架构模式之:领域模型(Domain Model)

    一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转 ...

  9. Facebook 发布「流程」

    时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...

  10. the bundle at bundle path is not signed using an apple submission certificate

    在app上架的时候,出现这个错误,也许只是你的Apple Worldwide Developer Relations Certification Authority Intermediate Cert ...