Object 对象
作为函数调用 Object 构造器
当把 Object 当做一个函数来调用,而不是一个构造器,它会执行一个类型转换。
Object ( [ value ] )
当以一个参数 value 或者无参数调用 Object 函数,采用如下步骤:
- 如果 value 是 null, undefined 或未指定,则创建并返回一个新 Object 对象 , 这个对象与仿佛用相同参数调用标准内置的 Object 构造器 (15.2.2.1) 的结果一样 .
- 返回 ToObject(value).
Object 构造器
当 Object 是 new 表达式调用的一部分时,它是一个构造器,可创建一个对象。
new Object ( [ value ] )
当以一个参数 value 或者无参数调用 Object 构造器,采用如下步骤:
- 如果提供了 value, 则如果 Type(value) 是 Object, 则如果 value 是个原生 ECMAScript 对象 , 不创建新对象,简单的返回 value.如果 value 是宿主对象 , 则采取动作和返回依赖实现的结果的方式可以使依赖于宿主对象的 .如果 Type(value) 是 String, 返回 ToObject(value).如果 Type(value) 是 Boolean, 返回 ToObject(value).如果 Type(value) 是 Number, 返回 ToObject(value).
- 断言 : 未提供参数 value 或其类型是 Null 或 Undefined.
- 令 obj 为一个新创建的原生 ECMAScript 对象 .
- 设定 obj 的 [[Prototype]] 内部属性为标准内置的 Object 的 prototype 对象 (15.2.4).
- 设定 obj 的 [[Class]] 内部属性为 "Object".
- 设定 obj 的 [[Extensible]] 内部属性为 true.
- 设定 obj 的 8.12 指定的所有内部方法
- 返回 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 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 返回 O 的 [[Prototype]] 内部属性的值 .
Object.getOwnPropertyDescriptor ( O, P )
当调用 getOwnPropertyDescriptor 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 令 name 为 ToString(P).
- 令 desc 为以参数 name 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
- 返回调用 FromPropertyDescriptor(desc) 的结果 (8.10.4).
Object.getOwnPropertyNames ( O )
当调用 getOwnPropertyNames 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 令 array 为仿佛是用表达式 new Array () 创建新对象的结果,这里的 Array 是标准内置构造器名。
- 令 n 为 0.
- 对 O 的每个自身属性 P令 name 为值是 P 的名称的字符串 .以 ToString(n) 和属性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 为参数调用 array 的 [[DefineOwnProperty]] 内部方法 .n 递增 1.
- 返回 array.
如果 O 是一个字符串实例,第 4 步处理的自身属性集合包含 15.5.5.2 定义的隐藏属性,他们对应对象的 [[PrimitiveValue]] 字符串中相应位置的字符。
Object.create ( O [, Properties] )
create 函数按照指定的原型创建一个新对象。当调用 create 函数,采用如下步骤:
- 如果 Type(O) 不是 Object 或 Null,则抛出一个 TypeError 异常 .
- 令 obj 为为仿佛是用表达式 new Object() 创建新对象的结果,这里的 Object 是标准内置构造器名。
- 设定 obj 的 [[Prototype]] 内部属性为 O.
- 如果传入了 Properties 参数并且不是 undefined, 则仿佛是用 obj 和 Properties 当作参数调用标准内置函数 Object.defineProperties 一样给 obj 添加自身属性。
- 返回 obj.
Object.defineProperty ( O, P, Attributes )
defineProperty 函数用于给一个对象添加一个自身属性 并 / 或 更新现有自身属性的特性。当调用 defineProperty 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 令 name 为 ToString(P).
- 令 desc 为以 Attributes 作为参数调用 ToPropertyDescriptor 的结果 .
- 以 name, desc, true 作为参数调用 O 的 [[DefineOwnProperty]] 内部方法 .
- 返回 O.
Object.defineProperties ( O, Properties )
defineProperties 函数用于给一个对象添加一些自身属性 并 / 或 更新现有的一些自身属性的特性。当调用 defineProperties 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 令 props 为 ToObject(Properties).
- 令 names 为一个内部列表,它包含 props 的每个可遍历自身属性的名称 .
- 令 descriptors 为一个空的内部列表 .
- 对 names 的每个元素 P,按照列表顺序 ,令 descObj 为以 P 作为参数调用 props 的 [[Get]] 内部方法的结果 .令 desc 为以 descObj 作为参数调用 ToPropertyDescriptor 的结果 .将 desc 插入 descriptors 的尾部 .
- 对 descriptors 的每个元素 desc,按照列表顺序 ,以参数 P, desc, true 调用 O 的 [[DefineOwnProperty]] 内部方法 .
- 返回 O
如果一个实现为 for-in 语句的定义了特定的枚举顺序,那么在这个算法的第 3 步中的列表元素必须也用相同的顺序排列。
Object.seal ( O )
当调用 seal 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 desc.[[Configurable]] 是 true, 设定 desc.[[Configurable]] 为 false.以 P, desc, true 为参数调用 O 的 [[DefineOwnProperty]] 内部方法 .
- 设定 O 的 [[Extensible]] 内部属性为 false.
- 返回 O.
Object.freeze ( O )
当调用 freeze 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 对 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]] 内部方法 .
- 设定 O 的 [[Extensible]] 内部属性为 false.
- 返回 O.
Object.preventExtensions ( O )
当调用 preventExtensions 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 设定 O 的 [[Extensible]] 内部属性为 false.
- 返回 O.
Object.isSealed ( O )
当以参数 O 调用 isSealed 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 desc.[[Configurable]] 是 true, 则返回 false.
- 如果 O 的 [[Extensible]] 内部属性是 false, 则返回 true.
- 否则 , 返回 false.
Object.isFrozen ( O )
当以参数 O 调用 isFrozen 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 对 O 的每个命名自身属性名 P,令 desc 为以参数 P 调用 O 的 [[GetOwnProperty]] 内部方法的结果 .如果 IsDataDescriptor(desc) 是 true,则如果 desc.[[Writable]] 是 true, 则返回 false.如果 desc.[[Configurable]] 是 true, 则返回 false.
- 如果 O 的 [[Extensible]] 内部属性是 false, 则返回 true.
- 否则 , 返回 false.
Object.isExtensible ( O )
当以参数 O 调用 isExtensible 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 返回 O 的 [[Extensible]] 内部属性布尔值 .
Object.keys ( O )
当以参数 O 调用 keys 函数,采用如下步骤:
- 如果 Type(O) 不是 Object,则抛出一个 TypeError 异常 .
- 令 n 为 O 的可遍历自身属性的个数
- 令 array 为仿佛是用表达式 new Array () 创建新对象的结果,这里的 Array 是标准内置构造器名。
- 令 index 为 0.
- 对 O 的每个可遍历自身属性名 P,以 ToString(index),属性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作为参数调用 array 的 [[DefineOwnProperty]] 内部方法。index 递增 1.
- 返回 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 方法,采用如下步骤:
- 如果 this 的值是 undefined, 返回 "[object Undefined]".
- 如果 this 的值是 null, 返回 "[object Null]".
- 令 O 为以 this 作为参数调用 ToObject 的结果 .
- 令 class 为 O 的 [[Class]] 内部属性的值 .
- 返回三个字符串 "[object ", class, and "]" 连起来的字符串 .
Object.prototype.toLocaleString ( )
当调用 toLocaleString 方法,采用如下步骤:
- 令 O 为以 this 作为参数调用 ToObject 的结果 .
- 令 toString 为以 "toString" 作为参数调用 O 的 [[Get]] 内部方法的结果 .
- 如果 IsCallable(toString) 是 false, 抛出一个 TypeError 异常 .
- 返回以 O 作为 this 值,无参数调用 toString 的 [[Call]] 内部方法的结果 .
这个函数给所有 Object 对象提供一个通用的 toLocaleString 接口,即使并不是所有的都使用它。目前,Array, Number, Date 提供了它们自身的语言环境敏感的 toLocaleString 方法。
这个函数的第一个参数可能会在此标准的未来版本中使用到;因此建议实现不要用这个位置参数来做其他事情。
Object.prototype.valueOf ( )
当调用 valueOf 方法,采用如下步骤:
- 令 O 为以 this 作为参数调用 ToObject 的结果 .
- 如果 O 是以一个宿主对象 (15.2.2.1) 为参数调用 Object 构造器的结果,则返回 O 或传递给构造器的原来的宿主对象 . 返回的具体结果是由实现定义的 .
- 返回 O.
Object.prototype.hasOwnProperty (V)
当以参数 V 调用 hasOwnProperty 方法,采用如下步骤:
- 令 P 为 ToString(V).
- 令 O 为以 this 值作为参数调用 ToObject 的结果 .
- 令 desc 为以 P 为参数调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
- 如果 desc 是 undefined, 返回 false.
- 返回 true.
不像 [[HasProperty]](8.12.6),这个方法不考虑原形链中的对象。
为步骤 1 和 2 的选择这样的顺序,是为了确保在本规范之前版本中会在这里的步骤 1 里抛出的任何异常,即使 this 值是 undefined 或 null,也会继续抛出。
Object.prototype.isPrototypeOf (V)
当以参数 V 调用 isPrototypeOf 方法,采用如下步骤:
- 如果 V 不是个对象 , 返回 false.
- 令 O 为以 this 作为参数调用 ToObject 的结果 .
- 重复令 V 为 V 的 [[Prototype]] 内部属性的值 .如果 V 是 null, 返回 false如果 O 和 V 指向同一个对象 , 返回 true.
为步骤 1 和 2 的选择这样的顺序,是为了当 V 不是对象并且 this 值是 undefined 或 null 时能够保持本规范之前版本指定的行为。
Object.prototype.propertyIsEnumerable (V)
当以参数 V 调用 propertyIsEnumerable 方法,采用如下步骤:
- 令 P 为 ToString(V).
- 令 O 为以 this 作为参数调用 ToObject 的结果 .
- 令 desc 为以 P 作为参数调用 O 的 [[GetOwnProperty]] 内部方法的结果 .
- 如果 desc 是 undefined, 返回 false.
- 返回 desc.[[Enumerable]] 的值 .
这个方法不考虑原型链中的对象。
为步骤 1 和 2 的选择这样的顺序,是为了确保在本规范之前版本中会在这里的步骤 1 里抛出的任何异常,即使 this 值是 undefined 或 null,也会继续抛出。
Object 的实例的属性
Object 的实例除了拥从 Object 的 prototype 对象继承来的属性之外不包含特殊的属性。
更多建议: