对象

最新更新: 2019-08-23 09:49:46 阅读: 58次

对象是未 排序的属性的集合,其中每个属性包含一个原语值、对象或函数。被作为属性保存的函数被称为方法。 

Object 是一个属性的集合。每个属性既可以是一个命名的数据属性,也可以是一个命名的访问器属性,或是一个内部属性:

  • 命名的数据属性(named data property)由一个名字与一个 ECMAScript 语言值和一个 Boolean 属性集合组成
  • 命名的访问器属性(named accessor property)由一个名字与一个或两个访问器函数,和一个 Boolean 属性集合组成。访问器函数用于存取一个与该属性相关联的 ECMAScript 语言值
  • 内部属性(internal property)没有名字,且不能直接通过 ECMAScript 语言操作。内部属性的存在纯粹为了规范的目的。

 有两种带名字的访问器属性(非内部属性):get 和 put,分别对应取值和赋值。

Property 特性

 本规范中的特性(Attributes)用于定义和解释命名属性(properties)的状态。命名的数据属性由一个名字关联到一个下表中列出的特性 (attributes)

命名的数据属性的特性
特性名称 取值范围 描述
[[Value]] 任何 ECMAScript 语言类型 通过读 property 来取到该值
[[Writable]] Boolean 如果为 false,试图通过 ECMAScript 代码 [[Put]] 去改变该属性的 [[Value]],将会失败
[[Enumerable]] Boolean 如果为 true,则该属性可被 for-in 枚举出来(参见 12.6.4),否则,该属性不可枚举。
[[Configurable]] Boolean 如果为 false,试图删除该属性,改变该属性为访问器属性,或改变它的 attributes(和 [[Value]] 不同),都会失败。

 命名的访问器属性由一个名字关联到一个下表中列出的特性 (attributes)

命名的访问器属性的特性
特性名称 取值范围 描述
[[Get]] Object 或 Undefined 如果该值为一个 Object 对象,那么它必须是一个函数对象。每次有对该属性进行 get 访问时,该函数的内部方法 [[Call]](8.6.2)会被一个空参数列表调用,以返回该属性值
[[Set]] Object 或 Undefined 如果该值为一个 Object 对象,那么它必须是一个函数对象。每次有对该属性进行 set 访问时,该函数的内部方法 [[Call]](8.6.2)会被一个参数列表调用,这个参数列表包含分配的值作为唯一的参数。property 的内部方法 [[Set]] 产生的影响可能会,但不是必须的,对随后的 property 内部方法 [[Get]] 的调用返回结果产生影响。
[[Enumerable]] Boolean 如果为 true,则该属性可被 for-in 枚举出来(参见 12.6.4),否则,该属性不可枚举。
[[Configurable]] Boolean 如果为 false,试图删除该属性,改变该属性为访问器属性,或改变它的 attributes(和 [[Value]] 不同),都会失败。

 如果某个命名属性的特性值没有在此规范中明确给出,那么它的默认值将使用下表的定义。

默认特性值
特性名称 默认值
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false

Object 内部属性及方法


  

  ECMASript并没有严格意义上的类,在这一点上不同于c++、smalltalk或者Java,不过作为替代,它支持构造函数(constructors),利用它,可通过执行代码创建对象:给对象分配存储,然后通过赋初始值来初始化对象属性的全部或部分。所有的构造函数都是对象,但并非所有的对象都是构造函数。每个构造函数都有一个prototype(原型)属性,被用于实现基于原型继承(prototype-based inheritance共享属性(shared properties)。使用构造函数来创建对象要用到new (新建)表达式,举个例子,new String('A String')创建一个新的字符串对象。不用new调用构造函数的后果取决于这个构造函数本身。举个例子, String("A String") 产生一个原语字符串而非对象。

  ECMAScript支持基于原型继承。每一个构造函数都有一个相关联的原型,它创建的所有都拥有一个隐含的引用指向那个与其构造函数相关联的原型(所谓对象的原型)更深一步讲,原型还可能回拥有到它的原型的隐含的非空引用,以此类推;这种被称为原型链(prototypechain)。若为某个对象中的一个属性建立引用,那么次引用指向该对象的原型链中,最先拥有同名属性的对象所包含的这个属性。换句话说,首先检查被直接体积的对象是否包含某同名属性,接下来检查它的原型,如此继续下去。

   通常,在基于类的面向对象语言中,实例装载状态,类装载方法,且继承的仅仅是结构和 行为。而在 ECMAScript 中,状态和方法均由对象装载,且结构、行为、状态都会被继承。

   所有没有直接包含某个它们的原型所包含的特定属性的对象,与它们的原型共享那个属性