本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.5节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.5 使用new操作符实例化构造函数
构造函数从根本上说是用于创建预配置对象的饼干模具模板。以String()为例,这个函数在与new操作符[new String('foo') ]一起使用时会创建基于String()模板的字符串实例。让我们来看一个示例。
<!DOCTYPE html><html lang="en"><body><script>
var myString = new String('foo');
console.log(myString); // 输出foo {0 = "f", 1 = "o", 2 = "o"}
</script></body></html>
上述代码创建了一个新的字符串对象,它是String()构造函数的一个实例。就像这样,我们在JavaScript中表达了一个字符串值。
注意
我并不是建议使用构造函数,而不使用等价方式:字面量/原始值,如var string="foo";。但我建议,要理解字面量/原始值背后的内容。
如前所述,JavaScript语言具有以下原生预定义的构造函数:Number()、String()、Boolean()、Object()、Array()、Function()、Date()、RegExp()和Error()。可以在任意一个构造函数上应用new操作符来实例化一个对象实例。如下代码,构建了这9类原生JavaScript对象。
<!DOCTYPE html><html lang="en"><body><script>
// 使用new关键字实例化每个原生构造函数
var myNumber = new Number(23);
var myString = new String('male');
var myBoolean = new Boolean(false);
var myObject = new Object();
var myArray = new Array('foo', 'bar');
var myFunction = new Function("x", "y", "return x*y");
var myDate = new Date();
var myRegExp = new RegExp('\bt[a-z]+\b');
var myError = new Error('Crap!');
// 输出/验证哪个构造函数创建了该对象
console.log(myNumber.constructor); // 输出Number()
console.log(myString.constructor); // 输出String()
console.log(myBoolean.constructor); // 输出Boolean()
console.log(myObject.constructor); // 输出Object()
console.log(myArray.constructor); // 在现在的浏览器中,输出Array()
console.log(myFunction.constructor); // 输出Function()
console.log(myDate.constructor); // 输出Date()
console.log(myRegExp.constructor); // 输出RegExp()
console.log(myError.constructor); // 输出Error()
</script></body></html>
通过使用new操作符,告诉JavaScript解释器,我们需要一个对应于构造函数实例的对象。例如,在上述代码中,Date()构造函数用于创建日期对象。Date()构造函数是日期对象的饼干模具。也就是说,它从Date()构造函数定义的默认模式中生成了日期对象。
至此,大家应该熟悉从原生构造函数[例如new String(‘foo’)]和用户自定义构造函数[例如new Person(true, 33, ‘male’)]创建对象实例的方法了。
注意
时刻记住,Math是一个静态对象——其他方法的容器,它不是使用new运算符的构造函数。