有关于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 相关文章推荐
一款js和css代码压缩工具[附JAVA环境配置方法]
Apr 16 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
Feb 22 Javascript
jQuery判断密码强度实现思路及代码
Apr 24 Javascript
用客户端js实现带省略号的分页
Apr 27 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
laydate日历控件使用方法详解
Nov 20 Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 Javascript
javascript中call,apply,callee,caller用法实例分析
Jul 24 Javascript
typescript编写微信小程序创建项目的方法
Jan 29 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检测url是否存在的方法
2015/04/14 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
jquery下json数组的操作实现代码
2010/08/09 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python3实现随机数
2018/06/25 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
Django框架安装方法图文详解
2019/11/04 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Python 解析xml文件的示例
2020/09/29 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
酒店led欢迎词
2014/01/09 职场文书
新学期开学寄语2016
2015/12/04 职场文书
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android