有关于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来实现可以输入值的下拉选单 雏型
Dec 06 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
node.js 用socket实现聊天的示例代码
Oct 17 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
VUE v-model表单数据双向绑定完整示例
Jan 21 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
js实现筛选功能
Nov 24 Javascript
js+html+css实现手动轮播和自动轮播
Dec 30 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
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
web页面数据展示新想法(json)
2010/06/08 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python发送邮件接收邮件示例分享
2014/01/21 Python
python中xrange和range的区别
2014/05/13 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
Python实现序列化及csv文件读取
2020/01/19 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
为什么要有struct关键字
2012/05/08 面试题
.NET面试题:什么是反射
2016/09/30 面试题
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
设置器与访问器的定义以及各自特点
2016/01/08 面试题
幼儿园数学教学反思
2014/02/02 职场文书
大学生新学期计划书
2014/04/28 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
介绍信如何写
2015/01/31 职场文书
解除处分决定书
2015/06/25 职场文书
redis限流的实际应用
2021/04/24 Redis
Redis实现一个账号只能登录一个设备
2022/04/19 Redis
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers