建议19:不要使用类型构造器
在默认状态下,JavaScript预定义了很多构造函数,如Function()、Array()、Date()、string()等,如果去掉小括号,它们就是JavaScript内置对象。在JavaScript中,构造函数实际上就是类的一种抽象结构。
利用new运算符调用构造函数,可以快速生成很多实例对象。例如:
- var f = new Function(p1, p2, ..., pn, body);
其中构造函数Function()的参数类型都是字符串,p1~pn表示所创建函数的参数名称列表,body表示所创建函数的函数结构体语句,在body语句之间通过分号进行分隔。可以完全省略所有参数,仅为构造函数传递一个字符串,用来表示函数的具体结构。f就是所创建函数的名称。例如: - var f = new Function("a", "b", "return a+b");
使用new Function()的形式来创建一个函数不是很常见,因为一个函数体通常会包括多条语句,如果将这些语句以一个字符串的形式作为参数来传递,代码的可读性会很差。类似的用法还有: - new Boolean(false)
new运算符调用函数会返回一个对象,该对象有一个valueof方法,同时返回被包装的函数,其实这是完全没有必要的,并且有时还令人困惑。不要使用new Boolean、new Number或new String。此外,应该避免使用new Object和new Array,可以使用{}和[]来代替。
在其他语言中,构造函数一般没有返回值,它只是初始化由this关键字所指代的对象,并且什么都不返回。但是,JavaScript构造函数可以返回一个对象,返回的对象将成为new运算符的运算值,此时this所引用的对象就会被覆盖。
- function F(){
- this.x = 1;
- return { y : 2 };
- }
- var f = new F();
- f.y; // 2
上面示例演示了如何使用返回的对象覆盖构造函数的实例对象,但是,如果返回值是原始值时,就不会覆盖实例化对象,此时按着普通函数的方式调用构造函数就可以得到返回值。 例如: - function F(){
- this.x = 1;
- return true;
- }
- var f = new F();
- f.x; // 1
- F(); // true
因此,如果构造函数的返回值为对象,可以直接调用构造函数来引用该返回值对象,而不需要使用new运算符来运算。