《JavaScript面向对象精要》——1.4 内建类型实例化

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中,除非需要通过一个或多个字符串动态构造正则表达式,否则都建议使用字面形式而不是构造函数。

总之,除了函数,对内建类型没什么正确或错误的实例化方法。很多开发者喜欢字面形式,另一些则喜欢用构造函数。你可以选择能令你觉得更舒服的那种。

时间: 2024-11-08 18:52:23

《JavaScript面向对象精要》——1.4 内建类型实例化的相关文章

《JavaScript面向对象精要》——导读

**前言**JavaScript拥有上述全部特性,因为语言本身没有类的概念,所以某些特性可能不是以你所期望的方式实现的.乍一看,一个JavaScript程序可能像是一个用C来编写的面向过程的程序.如果写一个函数并传递一些参数,就有了一个看上去没有对象也可工作的脚本.但是仔细观察,你就会在点号的使用上发现对象的存在. 很多面向对象的语言使用点号来访问对象的属性和方法,JavaScript也不例外.但是你永远不需要在JavaScript中写一个类定义,导入一个包或包含一个头文件.你只是用你需要的数据

《JavaScript面向对象精要》——1.3 引用类型

1.3 引用类型 引用类型是指JavaScript中的对象,同时也是你在该语言中能找到的最接近类的东西.引用值是引用类型的实例,也是对象的同义词(本章后面将用对象指代引用值).对象是属性的无序列表.属性包含键(始终是字符串)和值.如果一个属性的值是函数,它就被称为方法.JavaScript中函数其实是引用值,除了函数可以运行以外,一个包含数组的属性和一个包含函数的属性没有什么区别. 当然,在使用对象前,你必须先创建它们. 1.3.1 创建对象有时候,把JavaScript对象想象成图1-2中的哈

《JavaScript面向对象精要》——1.7 鉴别数组

1.7 鉴别数组 虽然instanceof可以鉴别数组,但是有一个例外会影响网页开发者:JavaScript的值可以在同一个网页的不同框架之间传来传去.当你试图鉴别一个引用值的类型时,这就有可能成为一个问题,因为每一个页面拥有它自己的全局上下文--Object.Array以及其他内建类型的版本.结果,当你把一个数组从一个框架传到另一个框架时,instanceof就无法识别它,因为那个数组是来自不同框架的Array的实例. 为了解决这个问题,ECMAScript 5引入了Array.isArray

编程-python内建类型与内部类型的区别

问题描述 python内建类型与内部类型的区别 python核心编程(第二版)书中第四章python对象中的两个概念 解决方案 内部类型是指定义在类型内的类型.内建类型是指语言提供的基本类型,无需定义,比如整数或者字符串. 解决方案二: 内建类型是python类库提供给你的基本数据类型内部类型是面向对象的,类的内部类型,它是类内部使用的

python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)_python

一.变量和表达式 复制代码 代码如下: >>> 1 + 1               2>>> print 'hello world' hello world>>> x = 1               >>> y = 2>>> x + y3 Python是强类型语言,无法根据上下文自动解析转换成合适的类型. Python是一种动态语言,在程序运行过程中,同一个变量名在运行的不同阶段可以代表不同形式的值(整型,浮

《JavaScript面向对象精要》——1.2 原始类型

1.2 原始类型 原始类型代表照原样保存的一些简单数据,如true和25.JavaScript共有5种原始类型,如下. Boolean 布尔,值为true或false Number 数字,值为任何整型或浮点数值 String 字符串,值为由单引号或双引号括出的单个字符或连续字符(JavaScript不区分字符类型) Null 空类型,该原始类型仅有一个值:null Undefined 未定义,该原始类型仅有一个值:undefined(undefined会被赋给一个还没有初始化的变量) 前3种类型

《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型

第1章 原始类型和引用类型 大多数开发者在使用Java或C#等基于类的语言的过程中学会了面向对象编程.由于JavaScript没有对类的正式支持,这些开发者在学习JavaScript时往往会迷失方向.JavaScript不需要在开头就定义好各种类,你可以在写代码的过程中根据需要创建数据结构.由于JavaScript缺少类,也就缺少用于对类进行分组的包.在Java中,包和类的名字不仅定义了对象的类型,也在工程中列出文件和目录的层次结构,JavaScript编程就好像从一块空白石板开始:你可以在上面

JavaScript面向对象精要

1. 作为函数调用,指代的是全局对象 如果我们定义以下函数: function f() {    console.log(this);} 然后将其作为普通对象调用,即f(),此时this指代的是全局对象window. 2. 作为对象的方法调用,指代是调用对象本身 如果我们将f作为一个对象的方法,也就是说作如下改造: var a = {};a.f = f; 然后通过对象a调用方法f,即a.f(),此时this指代的就是调用者a. 3. 作为构造器函数使用,指代的隐含的新建对象 如果我们用new语句

《JavaScript面向对象精要》——1.8 原始封装类型

1.8 原始封装类型 JavaScript中一个最让人困惑的部分可能就是原始封装类型的概念.原始封装类型共有3种(String.Number和Boolean).这些特殊引用类型的存在使得原始类型用起来和对象一样方便.(如果你不得不用独特的语法或切换为基于过程的编程方式来获取一个子字符串,那就太让人困惑啦). 当读取字符串.数字或布尔值时,原始封装类型将被自动创建.例如,下列代码第一行,一个原始字符串的值被赋给name.第二行代码把name当成一个对象,使用点号调用了charAt方法. var n