ECMA-262 把对象(object)定义为“属性的无序集合,每一个属性存放一个原始值、对象或函数”。严格来讲,这意味着对象是无特定顺序的值的数组。数组
尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)的表示。浏览器
每一个对象都由类定义,能够把类看作对象的配方。类不只要定义对象的接口(interface)(开发者访问的属性和方法),还要定义对象的内部工做(使属性和方法发挥做用的代码)。编译器和解释程序都根据类的说明构建对象。类是在对象之上的抽象,对象则是类的具体化,是类的实例。函数
类也叫作引用类型,其实在 ECMAScript 中,咱们不能访问对象的物理表示,只能访问对象的引用。每次建立对象,存储在变量中的都是该对象的引用,而不是对象自己。post
程序使用类建立对象时,生成的对象叫做类的实例(instance)。对类生成的对象的个数的惟一限制来自于运行代码的机器的物理内存。每一个实例的行为相同,但实例处理一组独立的数据。由类建立对象实例的过程叫作实例化(instantiation)。ui
其实,ECMAScript 并无正式的类。相反,ECMA-262 把对象定义描述为对象的配方。这是 ECMAScript 逻辑上的一种折中方案,由于对象定义其实是对象自身。即便类并不真正存在,咱们也把对象定义叫作类,由于大多数开发者对此术语更熟悉,并且从功能上说,二者是等价的。spa
在 ECMAScript 中,全部对象并不是同等建立的。操作系统
通常来讲,能够建立并使用的对象有三种:本地对象、内置对象和宿主对象。对象
本地对象定义为:“独立于宿主环境的 ECMAScript 实现提供的对象”。对于ECMAScript来讲,宿主环境就是操做系统和浏览器了。blog
本地对象就是ECMA-262定义的类(引用类型),在使用时,须要建立实例,也就是要new。包括:接口
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、
TypeError、URIError
内置对象定义为:“由 ECMAScript 实现提供的、独立于宿主环境的全部对象,在 ECMAScript 程序开始执行时出现”,也就是说开发者没必要明确实例化内置对象,它已被实例化了,直接调用就能够了,也就是不要new。内置对象也属于本地对象。
ECMAScript只定义了两个内置对象,也就是Global对象和Math对象。
Global对象是ECMAScript中最特别的对象,由于实际上它根本不存在!在ECMAScript中,不存在独立的函数,全部函数都必须是某个对象的方法。相似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。并且Global对象的方法还不止这些。有关Global对象的具体方法和属性请看这里:JavaScript 全局对象参考手册
注意:
一、有的地方把本地对象叫“内置对象”,内置对象叫“单体内置对象(Singleton Built-in Objects)”,意思差很少,这二者都是由ECMAScript自己实现提供的;
二、内置对象是在引擎初始化阶段就被建立好的对象,是本地对象的一个子集,而本地对象除此以外还包括了一些在运行过程当中动态建立的对象。
ECMAScript中的“宿主”就是咱们网页的运行环境,即“操做系统”和“浏览器”。全部非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。全部 BOM 和 DOM 对象都是宿主对象。
其实,ECMAScript官方未定义的对象都属于宿主对象,由于其未定义的对象大多数是咱们经过ECMAScript程序建立的对象。
那些官方定义好了的对象就叫本地对象。内置对象是本地对象的一种,其只包含Global对象和Math对象。而宿主对象则是那些官方未定义,咱们本身构建的对象加上DOM和BOM对象。