天天看点

JS编程建议——19:不要使用类型构造器

建议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

上面示例演示了如何使用返回的对象覆盖构造函数的实例对象,但是,如果返回值是原始值时,就不会覆盖实例化对象,此时按着普通函数的方式调用构造函数就可以得到返回值。 例如:

return true;

f.x; // 1

F(); // true

因此,如果构造函数的返回值为对象,可以直接调用构造函数来引用该返回值对象,而不需要使用new运算符来运算。

继续阅读