有关于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 easyui的tabs使用时的问题
Mar 23 Javascript
javascript dom代码应用 简单的相册[firefox only]
Jun 12 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 Javascript
jquery插件实现代码雨特效
Apr 24 jQuery
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 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
E路文章系统PHP
2006/12/11 PHP
php 静态化实现代码
2009/03/20 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Python实现验证码识别
2020/06/15 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
财务简历的自我评价
2014/03/05 职场文书
委托公证书
2014/04/08 职场文书
五四演讲稿范文
2014/09/03 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
趣味运动会赞词
2015/07/22 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers