有关于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 相关文章推荐
ExtJS 入门
Oct 29 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
jquery解析xml字符串示例分享
Mar 25 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
Jan 02 Javascript
Bootstrap学习笔记之css组件(3)
Jun 07 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
vue.js学习之递归组件
Dec 13 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
详解vue-cli3使用
Aug 14 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python基础教程之udp端口扫描
2014/02/10 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
对Python函数设计规范详解
2019/07/19 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Python bisect模块原理及常见实例
2020/06/17 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
音乐专业自荐信
2014/02/07 职场文书
师说教学反思
2014/02/07 职场文书
中学生操行评语
2014/04/24 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
详解 TypeScript 枚举类型
2021/11/02 Javascript