有关于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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
用 JavaScript 迁移目录
Dec 18 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
Jul 31 Javascript
javascript实现密码强度显示
Mar 18 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
Aug 22 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
详解vuex 中的 state 在组件中如何监听
May 23 Javascript
Vue2.0权限树组件实现代码
Aug 29 Javascript
15分钟深入了解JS继承分类、原理与用法
Jan 19 Javascript
vue项目部署到nginx/tomcat服务器的实现
Aug 26 Javascript
React列表栏及购物车组件使用详解
Jun 28 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
phpinfo的知识点总结
2019/10/10 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python爬取淘宝商品销量信息
2018/11/16 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python基于当前时间批量创建文件
2020/05/07 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
Numpy数组的广播机制的实现
2020/11/03 Python
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
社会实践心得体会
2014/01/03 职场文书
大学四年个人自我小结
2014/03/05 职场文书
广告词串烧
2014/03/19 职场文书
博士生专家推荐信
2015/03/25 职场文书
2015年度物流工作总结
2015/04/30 职场文书
运动会宣传稿50字
2015/07/23 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
话题作文之诚信
2019/11/28 职场文书
Minikube搭建Kubernetes集群
2022/03/31 Servers
分享Python异步爬取知乎热榜
2022/04/12 Python