在默认状态下,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运算符来运算。