有关于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图像处理思路及实现代码
Dec 25 Javascript
js 操作select与option(示例讲解)
Dec 20 Javascript
JavaScript作用域链示例分享
May 27 Javascript
js 获取经纬度的实现方法
Jun 20 Javascript
jQuery实现的自适应焦点图效果完整实例
Aug 24 Javascript
JavaScript实现选中文字提示新浪微博分享效果
Jun 15 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
vue和webpack打包项目相对路径修改的方法
Jun 15 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
Dec 28 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
mpvue 项目初始化及实现授权登录的实现方法
Jul 20 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
杏林同学录(二)
2006/10/09 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
javascript数组去重小结
2016/03/07 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
pycharm远程调试openstack代码
2017/11/21 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
职业生涯规划书的格式
2013/12/29 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫