有关于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实现检测浏览器及版本的脚本代码
Jan 22 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
js的image onload事件使用遇到的问题
Jul 15 Javascript
jquery JSON的解析方式示例介绍
Jul 27 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 Javascript
vue2.x select2 指令封装详解
Oct 12 Javascript
详解一个小实例理解js原型和继承
Apr 24 Javascript
Vue实现商品分类菜单数量提示功能
Jul 26 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
如何将Node.js中的回调转换为Promise
Nov 10 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
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
7个JS基础知识总结
2014/03/05 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
完善的jquery处理机制
2016/02/21 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
python交换两个变量的值方法
2019/01/12 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Python  Django 母版和继承解析
2019/08/09 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
介绍一下Linux中的链接
2016/06/05 面试题
房屋出租委托书格式
2014/09/23 职场文书
党的群众路线调研报告
2014/11/03 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
优质护理服务心得体会
2016/01/22 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL