有关于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之典型高阶函数应用介绍二
Jan 10 Javascript
利用js实现遮罩以及弹出可移动登录窗口
Jul 08 Javascript
href下载文件根据id取url并下载
May 28 Javascript
JavaScript简单表格编辑功能实现方法
Apr 16 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
vue-自定义组件传值的实例讲解
Sep 18 Javascript
用Vue.js在浏览器中实现裁剪图像功能
Jun 18 Javascript
vue中利用Promise封装jsonp并调取数据
Jun 18 Javascript
js实现秒表计时器
Dec 16 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
Python常用内置函数总结
2015/02/08 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
python 批量将中文名转换为拼音
2021/02/07 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
安全生产实施方案
2014/02/23 职场文书
银行职员自我鉴定
2014/04/20 职场文书
书香家庭事迹材料
2014/05/09 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
《包身工》教学反思
2016/02/23 职场文书