首页 > 编程笔记 > JavaScript笔记 > JS数组
阅读:23
通过JS Array原型扩展更多方法
Array 内置了很多方法,但是无法满足所有用户的需求,这时可以为 Array 对象扩展方法,以便提高代码重用率。扩展数组的方法一般通过 Array 的原型来实现。
其中 Array 是数组构造函数,prototype是构造函数的属性,由于该属性指向一个原型对象,然后通过点运算符为其定义属性或方法,这些属性和方法将被构造函数的所有实例对象继承。
首先,利用判断数组中是否存在名称为 m 的原型方法,如果存在则直接引用该原型方法即可,不再定义;否则,定义原型方法 m()。
其次,把定义的原型方法 m() 引用给原型方法 _m() ,这样做的目的是防止原型方法 m() 引用给 Object 对象的原型时发生死循环调用,可以兼容 Firefox 浏览器。
最后,把数组的临时原型方法 _m() 引用给 Object 对象的原型,这样能够确保所有对象都可以调用这个扩展方法。经过临时原型方法 _m() 的中转,就可以防止数组(Array)和对象(Object)都定义了同名方法,如果把该方法传递给 Object,而 Objrct 的原型方法又引用了 Array 的同名原型方法,就会发生循环引用现象。
设计模式
Array.prototype._m = Array.prototype.m || (Array.prototype.m = function () { //扩展方法的具体代码 }); Object.prototype.m = Array.prototype._m;上面代码是一种数组扩展方法的通用模式,详细解析如下。
其中 Array 是数组构造函数,prototype是构造函数的属性,由于该属性指向一个原型对象,然后通过点运算符为其定义属性或方法,这些属性和方法将被构造函数的所有实例对象继承。
首先,利用判断数组中是否存在名称为 m 的原型方法,如果存在则直接引用该原型方法即可,不再定义;否则,定义原型方法 m()。
其次,把定义的原型方法 m() 引用给原型方法 _m() ,这样做的目的是防止原型方法 m() 引用给 Object 对象的原型时发生死循环调用,可以兼容 Firefox 浏览器。
最后,把数组的临时原型方法 _m() 引用给 Object 对象的原型,这样能够确保所有对象都可以调用这个扩展方法。经过临时原型方法 _m() 的中转,就可以防止数组(Array)和对象(Object)都定义了同名方法,如果把该方法传递给 Object,而 Objrct 的原型方法又引用了 Array 的同名原型方法,就会发生循环引用现象。
示例
为数组扩展一个求所有元素和的方法。Array.prototype._m = Array.prototype.sum || //检测是否存在同名方法 (Array.prototype.m = function () { //定义该方法 var _n = 0, _this = []; //临时汇总变量 for (var i in this) { //遍历当前数组对象 if (_this[i] = parseFloat(this[i])) _n += _this[i]; //如果数组元素是数字,则进行累加 }; return _n; //返回累加的和 }); Object.prototype.sum = Array.prototype._sum; //把临时方法赋值给对象的原型方法sum()该原型方法 sum() 能够计算当前数组中元素为数字的和。在该方法的循环结构体中,首先试图把每个元素转换为浮点数,如果转换成功,则把它们相加;转换失败将返回 NaN,会忽略该元素的值。
var a = [1,2,3,4,5,6,7,8,"9"]; //定义数组直接量 console.log(a.sum()); //返回45其中第 9 个元素是一个字符串类型的数字,汇总时也被转换为数值进行相加。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频