有关于 JS 构造函数的重载和工厂方法,对此有需要的朋友,参考一下。
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
写在前面
有时候我们希望对象的初始化有多种方式。比如通过元素组成的数组来初始化一个 Set 对象,而不是通过传入构造函数的参数列表来初始化它
通过重载这个构造函数方法让它根据传入参数的不同,来执行不同的初始化方法。
- 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 没有做不到,只有想不到
来源: