有关于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 自定义事件初探
Aug 21 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
Javascript倒计时代码
Aug 12 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
js导出table到excel同时兼容FF和IE示例
Sep 03 Javascript
jquery幻灯片插件bxslider样式改进实例
Oct 15 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
Jul 20 Javascript
浏览器调试动态js脚本的方法(图解)
Jan 19 Javascript
微信小程序身份证验证方法实现详解
Jun 28 Javascript
Vue中img的src是动态渲染时不显示的解决
Nov 14 Javascript
AutoJs实现刷宝短视频的思路详解
May 22 Javascript
Vue图片裁剪组件实例代码
Jul 02 Vue.js
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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
PHP中的加密功能
2006/10/09 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
简单谈谈python的反射机制
2016/06/28 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
python中实现k-means聚类算法详解
2017/11/11 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
数据库方面面试题
2012/04/22 面试题
成功的酒店创业计划书
2013/12/27 职场文书
小学班级口号
2014/06/09 职场文书
学校三节实施方案
2014/06/09 职场文书
药剂专业自荐书
2014/06/20 职场文书
环境日宣传活动总结
2014/07/09 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
开平碉楼导游词
2015/02/06 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
学生会干部任命书
2015/09/21 职场文书