有关于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 相关文章推荐
jQuery 开发者应该注意的9个错误
May 03 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
js实现倒计时时钟的示例代码
Dec 17 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
Oct 15 Javascript
js实现图片无缝滚动特效
Mar 19 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
详解js界面跳转与值传递
Nov 22 Javascript
json数据传到前台并解析展示成列表的方法
Aug 06 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
微信小程序实现电影App导航和轮播
Nov 30 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
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python版大富翁源代码分享
2018/11/19 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
Python request使用方法及问题总结
2020/04/26 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
Yahoo-PHP面试题3
2012/01/14 面试题
护士见习期自我鉴定
2014/02/08 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
护校行动方案
2014/05/31 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
PyTorch device与cuda.device用法
2022/04/03 Python