有关于JS构造函数的重载和工厂方法


Posted in Javascript onApril 07, 2013

写在前面

有时候我们希望对象的初始化有多种方式。比如通过元素组成的数组来初始化一个Set对象,而不是通过传入构造函数的参数列表来初始化它

重载overload

通过重载这个构造函数方法让它根据传入参数的不同,来执行不同的初始化方法。

function Set() {
this.values = {}; // 用这个对象的属性保存这个集合
this.n = 0; // 集合中值的个数// 如果传入一个类数组的对象,将这个元素添加到集合中
// 否则,将所有的参数都添加到集合中
if(arguments.length === 1 && isArrayLike(arguments[0])) {
this.add.apply(this, arguments[0]); //把对象利用apply()添加到集合中
}else if(arguments.length > 0) {
this.add.apply(this, arguments); // 利用add()方法添加所有参数到集合中
}
}

这段代码所定义的Set()构造函数可以显式将一组元素作为参数列表传入,也可以传入元素组成的数组。但这个构造函数有多义性,如果集合的某个参数是一个数组就将无法通过这个构造函数来创建这个集合了(为了做到这一点,需要首先创建一个空集合,然后显示调用add()方法)。

工厂方法

一个类的方法用于返回类的一个实例。

// 工厂方法通过数组初始化Set对象
Set.fromArray = function(arr) {
var s = new Set();
s.add.apply(s, arr);
return s;
};

不同名字的工厂方法用以执行不同的初始化。但由于构造函数是类的公有标识,因此每个类只能有一个构造函数。但这并不是一个必须遵守的规则。

辅助构造函数

通过以函数的形式调用Set()来初始化这个新对象

// 定义Set类型的一个辅助构造函数
function SetFromArray(arr) {
// 通过以函数的形式调用Set()来初始化这个新对象
// 将arr的元素作为参数传入
Set.apply(this, arr);
}
// 设置原型, 以便SetFromArray能创建Set实例
SetFromArray.prototype = Set.prototype;

JavaScript 没有做不到,只有想不到

 

Javascript 相关文章推荐
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
Sep 25 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
jQuery如何跳转到另一个网页 就这么简单
Dec 28 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
jQuery实现简单的下拉菜单导航功能示例
Dec 07 jQuery
vue组件编写之todolist组件实例详解
Jan 22 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
vue自定义指令实现方法详解
Feb 11 Javascript
validform表单验证的实现方法
Mar 08 Javascript
JS完成代码前最好对其做5件事
Apr 07 #Javascript
有关于JS辅助函数inherit()的问题
Apr 07 #Javascript
运算符&&的三个不同层次
Apr 07 #Javascript
jquery实现excel导出的方法
Apr 04 #Javascript
关于jquery input textare 事件绑定及用法学习
Apr 03 #Javascript
Jquery实现弹出层分享微博插件具备动画效果
Apr 03 #Javascript
让低版本浏览器支持input的placeholder属性(js方法)
Apr 03 #Javascript
You might like
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
jquery简单体验
2007/01/10 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
python中的sort方法使用详解
2014/07/25 Python
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
详解python pandas 分组统计的方法
2019/07/30 Python
大数据分析用java还是Python
2020/07/06 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
环境工程大学生自荐信
2013/10/21 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
关于建议书的格式范文
2014/05/20 职场文书
获奖感言范文
2015/07/31 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
Python实现聚类K-means算法详解
2022/07/15 Python