本节书摘来自异步社区《JavaScript面向对象精要》一书中的第1章,第1.4节,作者:【美】Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 内建类型实例化
你已经见过如何用new Object()创建和使用通用对象。Object类型只是JavaScript提供的少量内建引用类型之一。其他内建类型各有它们的特殊用途,可在任何时候被实例化。
这些内建类型如下。
Array 数组类型,以数字为索引的一组值的有序列表
Date 日期和时间类型
Error 运行期错误类型(还有一些更特别的错误的子类型)
Function 函数类型
Object 通用对象类型
RegExp 正则表达式类型
可以用new来实例化每一个内建引用类型,如下。
var items = new Array();
var now = new Date();
var error = new Error("Something bad happened.");
var func = new Function("console.log('Hi');");
var object = new Object();
var re = new RegExp("\\d+");
1.4.1 字面形式
内建引用类型有字面形式。字面形式允许你在不需要使用new操作符和构造函数显式创建对象的情况下生成引用值(你曾在本章前面见过原始类型的字面形式,包括字符串、数字、布尔、空类型和未定义)。
1.4.2 对象和数组字面形式
要用对象字面形式创建对象,可以在大括号内定义一个新对象及其属性。属性的组成包括一个标识符或字符串、一个冒号以及一个值。多个属性之间用逗号分隔。例如,
var book = {
name: "The Principles of Object-Oriented JavaScript",
year: 2014
};
属性名字也可以用字符串表示,特别是当你希望名字中包含空格或其他特殊字符时。
var book = {
"name": "The Principles of Object-Oriented JavaScript",
"year": 2014
};
本例等价于前例,仅在语法上有所区别。下例是另一种等价写法。
var book = new Object();
book.name = "The Principles of Object-Oriented JavaScript";
book.year = 2014;
上述3例的结果是一致的:一个具有两个属性的对象。写法完全取决于你。
注意:
虽然使用字面形式并没有调用new Object(),但是JavaScript引擎背后做的工作和new Object()一样,除了没有调用构造函数。其他引用类型的字面形式也是如此。
定义数组的字面形式是在中括号内用逗号区分的任意数量的值。例如,
var colors = [ "red", "blue", "green" ];
console.log(colors[0]); // "red"
这段代码等价于:
var colors = new Array("red", "blue", "green")
console.log(colors[0]); // "red"
1.4.3 函数字面形式
基本上都要用字面形式来定义函数。考虑到在可维护性、易读性和调试上的巨大挑战,通常不会有人使用函数的构造函数,因此很少看到用字符串表示的代码而不是实际的代码。
使用字面形式创建函数更方便也更不容易出错,如下例。
function reflect(value) {
return value;
}
// is the same as
var reflect = new Function("value", "return value;");
这段代码定义了reflect()函数,它的作用是将任何传给它的参数返回。即使是这样一个简单的例子,使用字面形式都比构造函数的形式方便和易读。另外,用构造函数创建的函数没什么好的调试方法:JavaScript调试器认不出这些函数,它们在程序里就好像黑盒一样。
1.4.4 正则表达式字面形式
JavaScript允许用字面形式而不是使用RegExp构造函数定义正则表达式。它们看上去类似Perl中的正则表达式:模式被包含在两个“/”之间,第二个“/”后是由单字符表示的额外选项。例如,
var numbers = /\d+/g;
// is the same as
var numbers = new RegExp("\\d+", "g");
使用字面形式比较方便的一个原因是你不需要担心字符串中的转义字符。如果使用RegExp构造函数,传入模式的参数是一个字符串,你需要对任何反斜杠进行转义(这就是为什么字面形式使用“d”而构造函数使用“\”d的原因)。在JavaScript中,除非需要通过一个或多个字符串动态构造正则表达式,否则都建议使用字面形式而不是构造函数。
总之,除了函数,对内建类型没什么正确或错误的实例化方法。很多开发者喜欢字面形式,另一些则喜欢用构造函数。你可以选择能令你觉得更舒服的那种。