有关于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中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
Node.js中的事件驱动编程详解
Aug 16 Javascript
jQuery Easyui实现左右布局
Jan 26 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
jquery常用的12个小功能
Jul 22 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
Mar 07 Javascript
uni-app微信小程序登录授权的实现
May 22 Javascript
深入分析jQuery.one() 函数
Jun 03 jQuery
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写MySQL数据 实现代码
2009/06/15 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
微信小程序实现录音功能
2019/11/22 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
Python入门篇之列表和元组
2014/10/17 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
自荐信写法介绍
2014/01/25 职场文书
文明市民先进事迹
2014/05/15 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript