JS框架设计之对象数组化一种子模块
时间:2022-04-24
本文章向大家介绍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>
- Delegate如何进行类型转换?
- 个性化推荐系统(一)---今日头条等的内容划分、分类
- ASP.NET Core的配置(2):配置模型详解
- 如何解决jQuery Validation针对动态添加的表单无法工作的问题?
- 数据结构 链表改进
- 数据结构 栈&队列
- 终端品牌域名过期被拍卖 价值六位数
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
- ASP.NET的路由系统:路由映射
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
- ASP.NET的路由系统:URL与物理文件的分离
- 使用Excel分析CloudStack使用记录
- 卷积神经网络初探索
- TensorFlow 深度学习笔记 逻辑回归 实践篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Centos7]安装及配置bind(DNS服务)
- [Centos7.2]关于crontab报错
- [Centos7.2]关于升级python后防火墙无法启动
- [Centos7]关于限制IP通过ssh登陆
- Apache安装SSL证证书
- 打卡群刷题总结0717——不同路径 II
- [Centos7.2]Django挂载后台运行
- [Centos7+python3]IPy模块安装
- KVM实现分布式部署lamp并安装WordPress
- NumPy学的还不错?来试试这20题!
- 打卡群刷题总结0718——最小路径和
- linux之iptables应用详解
- MHA实现mysql的高可用集群
- su 与sudo
- COS存储批量删除buckets脚本