JS框架设计之对象数组化一种子模块
类数组对象是一个很好的存储结构,但是功能太弱了,为了享受纯数组的哪些便捷的方法,使用前可以做下转换,通常可以使用$.slice.call()方法做转换,但是旧版本的IE下的HTMLCollection、NodeList不是Object的子类,如果采用[].slice.call()方法可能会导致异常,下面是各大库是怎么处理的:
1、jQuery的makeArray
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../common/jquery-1.9.1.min.js"></script>
</head>
<body>
<script>
//一般将一个对象转换成数组需要用[].slice.call()方法来转换,但是在旧版本的IE中HTMLCollection、NodeList不是Object的子类,是com对象
//所以无法使用[].slice.call()方法来把传入的对象数组化,下面是jQuery兼容IE旧版本的对象数组化方法 //该方法有以下保证
/*
1、不管是否传入参数,始终返回一个数组,如果不传参,则返回一个空数组
2、对传入的参数(不包含length属性、是字符串、是jQuery方法的、是array的setInterval的)将他们的引用存入数组的第一项
3、如果传入的参数符合数组化的要求,则进行数组化
*/ //注意:传入的集合必须是具有length属性,然后集合的键值必须是数字,也就是具有数组结构的集合,才能被转换
var makeArray=function(array)
{
var ret=[];
if(array!=null)
{
var l=array.length;
if(l==null || typeof array==="string" ||jQuery.isFunction(array) || array.setInterval)
{
ret[0]=array;
}
else
{
while (l)
ret[--l]=array[l];
}
}
return ret;
}
alert(makeArray({length:3,0:"a",1:"b",2:"c"})[1]);
</script>
</body>
</html>
2、dojo的对象数组化方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
dojo的对象数组化方法和Ext一样,都是在一开始判断浏览器类型,他的后面也有两个参数,用于操作转化后的数组
但是dojo后面的两个参数,不是要截取数组的开始索引和结束索引
dojo的第一个参数是要转换成数组的对象,第二个是偏移量,第三个是已有的数组,返回值是已有的数组和转换后,并截取过的合并数组
*/
var zc={};
isIE=true;
(function(){
var efficient=function (obj,offest,startWith) {
return (startWith||[]).concat([].slice.call(obj,offest || 0));
}
var slow=function (obj,offest,startWith) {
var arr=startWith || [];
//偏移量不支持负数
for(var i=offest || 0;i<obj.length;i++) {
arr.push(obj[i]);
}
return arr;
}
zc.toArray=isIE?function (obj) {
return slow.apply(this,arguments);
}:efficient;
})();
alert(zc.toArray({length:3,0:"a",1:"b",2:"c"},0,[1,2,3]));
</script>
</body>
</html>
3、Ext的对象数组化方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
Ext设计的比较巧妙,在框架一加载的同时,就判断浏览器的的类型,然后存到变量中,后面就不需要判断浏览了,
然后根据浏览器的是不是IE来选择toArray到底引用那个方法体,如果是IE浏览器,则吊用自定义的对象数组化方法,
如果不是则调用[].slice.call(),并通过slice方法,通过i,j参数对字符串进行截取操作
*/
/*
该方法有以下保证
1、如果在IE浏览器下执行,则则调用自定义的对象数组化方法
2、如果不再IE下,吊用[].slice.call()来进行对象数组化
3、可以提供两个参数(start,end),用于截取指定长度的转换后的对象数组
*/
var toArray=function () {
var returnisIE;//判断浏览器是否是IE
return returnisIE?function(a,i,j){
var length=a.length || 0,result=new Array(length);
while (length--)
result[length]=a[length];
return result.slice(i || 0,j|| a.length);
}:function(a,i,j){
return Array.prototype.slice.call(a,i || 0,j || a.length);
};
}();
var res=toArray({length:2,0:"a",1:"2"},1);
alert(res)
</script>
</body>
</html>
4、mootools
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
mootools的对象数组化方法
*/
/*
该方法有以下保证
1、当用户传入的是HTMLCollection集合是,因为老版IE的HTML节点对象是COM对象,不是Js对象的子类,所以无法使用[].slice.call()方法
使用自定义的对象数组化方法
2、如果传入的对象不是上面的那种情况,那么吊用[].slice.call()方法来进行对象数组化
*/
function $A(array)
{
if(array.item)
{
var length=array.length || 0,result=new Array(length);
while (length--)
result[length]=array[length];
return result;
}
return Array.prototype.slice.call(array);
}
var res=$A({length:2,0:1,1:2});//输出:1,2
alert(res)
</script>
</body>
</html>
5、Prototype
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
Prototype的对象转换成数组的方法
*/ /*
该方法有以下保证
1、如果不传入参数,返回空数组
2、如果当前浏览器支持toArray()方法,那么调用该对象的toArray()方法
3、如果上面两种条件都不满足,那么拿到当前对象的length属性(如果没有给0),然后new一个具有length长度的数组,并进行赋值
*/ //注意:要转换成数组的对象的length不能大于实际元素的长度,也不能小于实际元素的长度
function $A(array){
if(!array)return [];
if(array.toArray)return array.toArray();
var length=array.length || 0,results=new Array(length);
while (length--)
results[length]=array[length];
return results;
}
var result=$A({length:3,0:1,1:2,2:3});
alert(result);
</script>
</body>
</html>
6、mass
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
下面是mass的对象数组化方法
*/
/*
该方法有以下保证:
1、一开始就对浏览器进行区分
2、如果是IE则调用自定义对戏那个数组化方法,如果不是,则使用[].slice.call
3、提供start和end参数,方便对(传入对象数组化之后的数组)进行截取
4、保证start和end参数的输入不会影响输出结果
*/
isIE=true;
var toArray=window.isIE?function(nodes,start,end)
{
var ret=[],length=nodes.length;
if(end===void 0 || typeof end==="number" && isFinite(end))
{
start=parseInt(start,10) || 0;
end=end==void 0?length:parseInt(end,10);
if(start<0)
start+=length;
if(end>length)
end=length;
if(end<0)
end+=length;
for(var i=start;i<end;i++)
{
ret[i-start]=nodes[i];
}
}
return ret;
}:function (nodes,start,end)
{
return Array.prototype.slice.call(nodes,start,end);
};
var res=toArray({length:3,0:1,1:"a",2:"b"},0,-1);//输出:1,a
alert(res);
</script>
</body>
</html>
JS框架设计之对象数组化一种子模块的更多相关文章
- JS框架设计之对象类型判断一种子模块
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型.基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型 ...
- js框架设计1.3数组化
这一节从作者哪里学来了[].slice.call([],0,1);这个方法第一个参数可是是字符串可以是数组或其他,第2个是数组截取位置的开始位置,第3个是终止位置. 作者说这个方法不兼容旧版本ie的, ...
- JS框架设计之对象扩展一种子模块
对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功能,将新添加的功能整合到我们定义的对象中 ...
- js框架设计1.1命名空间笔记
借到了司徒正美的写的js框架设计一书,司徒大神所著有些看不太懂,果然尚需循序渐进,稳扎js基础之中. 第一张开篇司徒阐述了种子模块的概念 种子模块亦为核心模块,框架最先执行模块,司徒见解应包含:对象扩 ...
- 对象数组化 Object.values(this.totalValueObj).forEach(value => {
对象数组化 Object.values(this.totalValueObj).forEach(value => {
- JS框架设计读书笔记之-核心模块
随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...
- JS框架设计之命名空间设计一种子模块
命名空间 1.种子模块作为一个框架的最开始,除了负责初始化框架的最基础部分. 2.种子模块作为框架的最开始,那么什么是种子框架的最开始呢?答案是IIFE(立即调用函数表达式); IIFE(立即调用函数 ...
- js框架设计1.2对象扩展笔记
需要一个新的功能添加到我们的命名空间上.这方法在JS中被叫做extend或者mixin,若是遍历属性用一下1.1代码,则会遍历不出原型方法,所以1.2介绍的是mass Framework里的mix方法 ...
- Js框架设计之DomReady
一.在介绍DomReady之前,先了解下相关的知识 1.HTML是一种标记语言,告诉我们这页面里面有什么内容,但是行为交互则要通过DOM操作来实现,但是注意:不要把尖括号里面的内容看作是DOM! 2. ...
随机推荐
- cmake 语法
语法说明 CMakeLists.txt 文件遵循一种简单的语法包括 注释,命令和空格字符.注释使用#符号,从符号开始之后的一行都表示注释.命令包括命令名,左括号,分隔参数的空白字符和右括号.命令既可以 ...
- Redis是可以安装成windows服务-开机自启 win7 64位
其实Redis是可以安装成windows服务的,开机自启动,命令如下: redis-server --service-install redis.windows.conf 安装完之后,就可看到Redi ...
- iOS9 视频播放
self.videoFileURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:///%@", self ...
- spring mvc 数据回显
1.spring mvc自动将传入的pojo数据存入request域 request中的key是该pojo类名,首字母小写. JSP controller 第一次访问user.jsp 填写表单 点击提 ...
- 试题 C: 数列求值 蓝桥杯
试题 C: 数列求值本题总分: 10 分[问题描述]给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和.求第 20190324 项的最后 4 位数字.[ ...
- (2)-生成JSONObject的方法
生成JSONObject一般有两种方式,通过javabean或者map类型来生成.如下面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...
- Objective-C 学习笔记(五) 快速枚举
Objective-C 快速枚举 快速枚举是一个Objective-C的功能,有助于列举一个集合. 快速枚举语法 for (classType variable in collectionObject ...
- Jquery 自定义插件写法(示例)
(function ($) { $.SmsHelper = $.SmsHelper || {}; $.extend($.SmsHelper, { //插件具体实现代码 yzmnum: 60, Ajax ...
- c#格式化字符
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- scala 删除一个文件夹以及其子目录和文件
/** * 删除一个文件夹,及其子目录 @param dir */ def deleteDir(dir: File): Unit = { val files = dir.listFiles() fil ...