实例对象与 new 命令
JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScript
面向对象编程的基础知识。
对象是什么
面向对象编程(Object Oriented Programming,缩写为
OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。对象可以复用,通过继承机制还可以定制。因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural
programming),更适合多人合作的大型软件项目。
那么,“对象”(object)到底是什么?我们从两个层次来理解。
(1)对象是单个实物的抽象。
一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个远程服务器连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。
(2)对象是一个容器,封装了属性( ...
JSON 对象
JSON 格式
JSON 格式(JavaScript Object Notation
的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford
提出,目的是取代繁琐笨重的 XML 格式。
相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;符合
JavaScript
原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON
迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
每个 JSON
对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
JSON 对值的类型和格式有严格的规定。
复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN,
Infinity,
-Infinity和undefined)。
字符串必须使用双引号表示,不能使用单引号。
对象的键名必须放在双引号里面。
数组或对象最后一个成员的后面,不能加逗号。
以下都是合 ...
RegExp 对象
RegExp对象提供正则表达式的功能。
概述
正则表达式(regular
expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。比如,正则表达式给出一个
Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。JavaScript
的正则表达式体系是参照 Perl 5 建立的。
新建正则表达式有两种方法。一种是使用字面量,以斜杠表示开始和结束。
1var regex = /xyz/;
另一种是使用RegExp构造函数。
1var regex = new RegExp('xyz');
上面两种写法是等价的,都新建了一个内容为xyz的正则表达式对象。它们的主要区别是,第一种方法在引擎编译代码时,就会新建正则表达式,第二种方法在运行时新建正则表达式,所以前者的效率较高。而且,前者比较便利和直观,所以实际应用中,基本上都采用字面量定义正则表达式。
RegExp构造函数还可以接受第二个参数,表示修饰符(详细解释见下文)。
123var regex = new RegExp ...
Date 对象
Date对象是 JavaScript
原生的时间库。它以国际标准时间(UTC)1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒)。
普通函数的用法
Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。
12Date()// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
注意,即使带有参数,Date作为普通函数使用时,返回的还是当前时间。
12Date(2000, 1, 1)// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
上面代码说明,无论有没有参数,直接调用Date总是返回当前时间。
构造函数的用法
Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。
1var today = new Date();
Date实例有一个独特的地方。其他对象求值的时候,都是默认调用.valueOf()方法,但是Date实例求值的时候,默 ...
Math 对象
Math是 JavaScript
的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
静态属性
Math对象的静态属性,提供以下一些数学常数。
Math.E:常数e。
Math.LN2:2 的自然对数。
Math.LN10:10 的自然对数。
Math.LOG2E:以 2 为底的e的对数。
Math.LOG10E:以 10 为底的e的对数。
Math.PI:常数π。
Math.SQRT1_2:0.5 的平方根。
Math.SQRT2:2 的平方根。
12345678Math.E // 2.718281828459045Math.LN2 // 0.6931471805599453Math.LN10 // 2.302585092994046Math.LOG2E // 1.4426950408889634Math.LOG10E // 0.4342944819032518Math.PI // 3.141592653589793Math.SQRT1_2 // 0.7071067811865476Math.SQRT2 / ...
String 对象
概述
String对象是 JavaScript
原生提供的三个包装对象之一,用来生成字符串对象。
1234567var s1 = 'abc';var s2 = new String('abc');typeof s1 // "string"typeof s2 // "object"s2.valueOf() // "abc"
上面代码中,变量s1是字符串,s2是对象。由于s2是字符串对象,s2.valueOf方法返回的就是它所对应的原始字符串。
字符串对象是一个类似数组的对象(很像数组,但不是数组)。
1234new String('abc')// String {0: "a", 1: "b", 2: "c", length: 3}(new String('abc'))[1] // "b"
上面代码中,字符串abc对应的字符串对象 ...
Number 对象
概述
Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。
作为构造函数时,它用于生成值为数值的对象。
12var n = new Number(1);typeof n // "object"
上面代码中,Number对象作为构造函数使用,返回一个值为1的对象。
作为工具函数时,它可以将任何类型的值转为数值。
1Number(true) // 1
上面代码将布尔值true转为数值1。Number作为工具函数的用法,详见《数据类型转换》一章。
静态属性
Number对象拥有以下一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。
Number.POSITIVE_INFINITY:正的无限,指向Infinity。
Number.NEGATIVE_INFINITY:负的无限,指向-Infinity。
Number.NaN:表示非数值,指向NaN。
Number.MIN_VALUE:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-Numbe ...
Boolean 对象
概述
Boolean对象是 JavaScript
的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。
1234var b = new Boolean(true);typeof b // "object"b.valueOf() // true
上面代码的变量b是一个Boolean对象的实例,它的类型是对象,值为布尔值true。
注意,false对应的包装对象实例,布尔运算结果也是true。
1234567if (new Boolean(false)) { console.log('true');} // trueif (new Boolean(false).valueOf()) { console.log('true');} // 无输出
上面代码的第一个例子之所以得到true,是因为false对应的包装对象实例是一个对象,进行逻辑运算时,被自动转化成布尔值true(因为所有对象对应的布尔值都是true)。而实例的valueOf方法,则返回 ...
包装对象
定义
对象是 JavaScript
语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。
所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
1234567891011var v1 = new Number(123);var v2 = new String('abc');var v3 = new Boolean(true);typeof v1 // "object"typeof v2 // "object"typeof v3 // "object"v1 === 123 // falsev2 === 'abc' // falsev3 === true // false
上面代码中,基于原始类型的值,生成了三个对应的包装对象。可以看到,v1、v2、v3都是对象,且与对应的简 ...
Array 对象
构造函数
Array是 JavaScript
的原生对象,同时也是一个构造函数,可以用它生成新的数组。
123var arr = new Array(2);arr.length // 2arr // [ empty x 2 ]
上面代码中,Array()构造函数的参数2,表示生成一个两个成员的数组,每个位置都是空值。
如果没有使用new关键字,运行结果也是一样的。
123var arr = Array(2);// 等同于var arr = new Array(2);
考虑到语义性,以及与其他构造函数用法保持一致,建议总是加上new。
Array()构造函数有一个很大的缺陷,不同的参数个数会导致不一致的行为。
12345678910111213141516171819// 无参数时,返回一个空数组new Array() // []// 单个正整数参数,表示返回的新数组的长度new Array(1) // [ empty ]new Array(2) // [ empty x 2 ]// 非正整数的数值作为参数,会报错new Array(3.2) // RangeErr ...