Object 对象

2018-06-16 15:27 更新

作为函数调用 Object 构造器

 当把 Object 当做一个函数来调用,而不是一个构造器,它会执行一个类型转换。

Object ( [ value ] )

 当以一个参数 value 或者无参数调用 Object 函数,采用如下步骤:

  1. 如果 value 是 null, undefined 或未指定,则创建并返回一个新 Object 对象 , 这个对象与仿佛用相同参数调用标准内置的 Object 构造器 (15.2.2.1) 的结果一样 .
  2. 返回 ToObject(value).

Object 构造器

 当 Object 是 new 表达式调用的一部分时,它是一个构造器,可创建一个对象。

new Object ( [ value ] )

 当以一个参数 value 或者无参数调用 Object 构造器,采用如下步骤:

  1. 如果提供了 value, 则如果 Type(value) 是 Object, 则如果 value 是个原生 ECMAScript 对象 , 不创建新对象,简单的返回 value.如果 value 是宿主对象 , 则采取动作和返回依赖实现的结果的方式可以使依赖于宿主对象的 .如果 Type(value) 是 String, 返回 ToObject(value).如果 Type(value) 是 Boolean, 返回 ToObject(value).如果 Type(value) 是 Number, 返回 ToObject(value).
  2. 断言 : 未提供参数 value 或其类型是 Null 或 Undefined.
  3. 令 obj 为一个新创建的原生 ECMAScript 对象 .
  4. 设定 obj 的 [[Prototype]] 内部属性为标准内置的 Object 的 prototype 对象 (15.2.4).
  5. 设定 obj 的 [[Class]] 内部属性为 "Object".
  6. 设定 obj 的 [[Extensible]] 内部属性为 true.
  7. 设定 obj 的 8.12 指定的所有内部方法
  8. 返回 obj.

Object 构造器的属性

 Object 构造器的 [[Prototype]] 内部属性值是标准内置 Function 的 prototype 对象。

 除了内部属性和 length 属性(其值是 1)之外,Object 构造器拥有以下属性:

Object.prototype

 Object.prototype 的初始值是标准内置 Object 的 prototype 对象(15.2.4)。

 这个属性包含特性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

Object.getPrototypeOf ( O )

 当以参数 O 调用 getPrototypeOf 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 返回 O 的 [[Prototype]] 内部属性的值 .

Object.getOwnPropertyDescriptor ( O, P )

 当调用 getOwnPropertyDescriptor 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 令 name 为 ToString(P).
  3. 令 desc 为以参数 name 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
  4. 返回调用 FromPropertyDescriptor(desc) 的结果 (8.10.4).

Object.getOwnPropertyNames ( O )

 当调用 getOwnPropertyNames 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 令 array 为仿佛是用表达式 new Array () 创建新对象的结果,这里的 Array 是标准内置构造器名。
  3. 令 n 为 0.
  4. 对 O 的每个自身属性 P令 name 为值是 P 的名称的字符串 .以 ToString(n) 和属性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 为参数调用 array 的 [[DefineOwnProperty]] 内部方法 .n 递增 1.
  5. 返回 array.

 如果 O 是一个字符串实例,第 4 步处理的自身属性集合包含 15.5.5.2 定义的隐藏属性,他们对应对象的 [[PrimitiveValue]] 字符串中相应位置的字符。

Object.create ( O [, Properties] )

 create 函数按照指定的原型创建一个新对象。当调用 create 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object 或 Null,则抛出一个 TypeError 异常 .
  2. 令 obj 为为仿佛是用表达式 new Object() 创建新对象的结果,这里的 Object 是标准内置构造器名。
  3. 设定 obj 的 [[Prototype]] 内部属性为 O.
  4. 如果传入了 Properties 参数并且不是 undefined, 则仿佛是用 obj 和 Properties 当作参数调用标准内置函数 Object.defineProperties 一样给 obj 添加自身属性。
  5. 返回 obj.

Object.defineProperty ( O, P, Attributes )

 defineProperty 函数用于给一个对象添加一个自身属性 并 / 或 更新现有自身属性的特性。当调用 defineProperty 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 令 name 为 ToString(P).
  3. 令 desc 为以 Attributes 作为参数调用 ToPropertyDescriptor 的结果 .
  4. 以 name, desc, true 作为参数调用 O 的 [[DefineOwnProperty]] 内部方法 .
  5. 返回 O.

Object.defineProperties ( O, Properties )

 defineProperties 函数用于给一个对象添加一些自身属性 并 / 或 更新现有的一些自身属性的特性。当调用 defineProperties 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 令 props 为 ToObject(Properties).
  3. 令 names 为一个内部列表,它包含 props 的每个可遍历自身属性的名称 .
  4. 令 descriptors 为一个空的内部列表 .
  5. 对 names 的每个元素 P,按照列表顺序 ,令 descObj 为以 P 作为参数调用 props 的 [[Get]] 内部方法的结果 .令 desc 为以 descObj 作为参数调用 ToPropertyDescriptor 的结果 .将 desc 插入 descriptors 的尾部 .
  6. 对 descriptors 的每个元素 desc,按照列表顺序 ,以参数 P, desc, true 调用 O 的 [[DefineOwnProperty]] 内部方法 .
  7. 返回 O

 如果一个实现为 for-in 语句的定义了特定的枚举顺序,那么在这个算法的第 3 步中的列表元素必须也用相同的顺序排列。

Object.seal ( O )

 当调用 seal 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 desc.[[Configurable]] 是 true, 设定 desc.[[Configurable]] 为 false.以 P, desc, true 为参数调用 O 的 [[DefineOwnProperty]] 内部方法 .
  3. 设定 O 的 [[Extensible]] 内部属性为 false.
  4. 返回 O.

Object.freeze ( O )

 当调用 freeze 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 IsDataDescriptor(desc) 是 true, 则如果 desc.[[Writable]] 是 true, 设定 desc.[[Writable]] 为 false.如果 desc.[[Configurable]] 是 true, 设定 desc.[[Configurable]] 为 false.以 P, desc, true 作为参数调用 O 的 [[DefineOwnProperty]] 内部方法 .
  3. 设定 O 的 [[Extensible]] 内部属性为 false.
  4. 返回 O.

Object.preventExtensions ( O )

 当调用 preventExtensions 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 设定 O 的 [[Extensible]] 内部属性为 false.
  3. 返回 O.

Object.isSealed ( O )

 当以参数 O 调用 isSealed 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 desc.[[Configurable]] 是 true, 则返回 false.
  3. 如果 O 的 [[Extensible]] 内部属性是 false, 则返回 true.
  4. 否则 , 返回 false.

Object.isFrozen ( O )

 当以参数 O 调用 isFrozen 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 IsDataDescriptor(desc) 是 true,则如果 desc.[[Writable]] 是 true, 则返回 false.如果 desc.[[Configurable]] 是 true, 则返回 false.
  3. 如果 O 的 [[Extensible]] 内部属性是 false, 则返回 true.
  4. 否则 , 返回 false.

Object.isExtensible ( O )

 当以参数 O 调用 isExtensible 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 返回 O 的 [[Extensible]] 内部属性布尔值 .

Object.keys ( O )

 当以参数 O 调用 keys 函数,采用如下步骤:

  1. 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
  2. 令 n 为 O 的可遍历自身属性的个数
  3. 令 array 为仿佛是用表达式 new Array () 创建新对象的结果,这里的 Array 是标准内置构造器名。
  4. 令 index 为 0.
  5. 对 O 的每个可遍历自身属性名 P,以 ToString(index),属性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作为参数调用 array 的 [[DefineOwnProperty]] 内部方法。index 递增 1.
  6. 返回 array.

 如果一个实现为 for-in 语句的定义了特定的枚举顺序,那么在这个算法的第 5 步中的必须使用相同的枚举顺序。

Object 的 prototype 对象的属性

 Object 的 prototype 对象的 [[Prototype]] 内部属性的值是 null,[[Class]] 内部属性的值是 "Object",[[Extensible]] 内部属性的初始值是 true。

Object.prototype.constructor

 Object.prototype.constructor 的初始值是标准内置的 Object 构造器。

Object.prototype.toString ( )

 当调用 toString 方法,采用如下步骤:

  1. 如果 this 的值是 undefined, 返回 "[object Undefined]".
  2. 如果 this 的值是 null, 返回 "[object Null]".
  3. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  4. 令 class 为 O 的 [[Class]] 内部属性的值 .
  5. 返回三个字符串 "[object ", class, and "]" 连起来的字符串 .

Object.prototype.toLocaleString ( )

 当调用 toLocaleString 方法,采用如下步骤:

  1. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  2. 令 toString 为以 "toString" 作为参数调用 O 的 [[Get]] 内部方法的结果 .
  3. 如果 IsCallable(toString) 是 false, 抛出一个 TypeError 异常 .
  4. 返回以 O 作为 this 值,无参数调用 toString 的 [[Call]] 内部方法的结果 .

 这个函数给所有 Object 对象提供一个通用的 toLocaleString 接口,即使并不是所有的都使用它。目前,Array, Number, Date 提供了它们自身的语言环境敏感的 toLocaleString 方法。

 这个函数的第一个参数可能会在此标准的未来版本中使用到;因此建议实现不要用这个位置参数来做其他事情。

Object.prototype.valueOf ( )

 当调用 valueOf 方法,采用如下步骤:

  1. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  2. 如果 O 是以一个宿主对象 (15.2.2.1) 为参数调用 Object 构造器的结果,则返回 O 或传递给构造器的原来的宿主对象 . 返回的具体结果是由实现定义的 .
  3. 返回 O.

Object.prototype.hasOwnProperty (V)

 当以参数 V 调用 hasOwnProperty 方法,采用如下步骤:

  1. 令 P 为 ToString(V).
  2. 令 O 为以 this 值作为参数调用 ToObject 的结果 .
  3. 令 desc 为以 P 为参数调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
  4. 如果 desc 是 undefined, 返回 false.
  5. 返回 true.

 不像 [[HasProperty]](8.12.6),这个方法不考虑原形链中的对象。

 为步骤 1 和 2 的选择这样的顺序,是为了确保在本规范之前版本中会在这里的步骤 1 里抛出的任何异常,即使 this 值是 undefined 或 null,也会继续抛出。

Object.prototype.isPrototypeOf (V)

 当以参数 V 调用 isPrototypeOf 方法,采用如下步骤:

  1. 如果 V 不是个对象 , 返回 false.
  2. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  3. 重复令 V 为 V 的 [[Prototype]] 内部属性的值 .如果 V 是 null, 返回 false如果 O 和 V 指向同一个对象 , 返回 true.

 为步骤 1 和 2 的选择这样的顺序,是为了当 V 不是对象并且 this 值是 undefined 或 null 时能够保持本规范之前版本指定的行为。

Object.prototype.propertyIsEnumerable (V)

 当以参数 V 调用 propertyIsEnumerable 方法,采用如下步骤:

  1. 令 P 为 ToString(V).
  2. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  3. 令 desc 为以 P 作为参数调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
  4. 如果 desc 是 undefined, 返回 false.
  5. 返回 desc.[[Enumerable]] 的值 .

 这个方法不考虑原型链中的对象。

 为步骤 1 和 2 的选择这样的顺序,是为了确保在本规范之前版本中会在这里的步骤 1 里抛出的任何异常,即使 this 值是 undefined 或 null,也会继续抛出。

Object 的实例的属性

 Object 的实例除了拥从 Object 的 prototype 对象继承来的属性之外不包含特殊的属性。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号