作為函數(shù)調(diào)用 Object 構(gòu)造器
當(dāng)把 Object 當(dāng)做一個(gè)函數(shù)來調(diào)用,而不是一個(gè)構(gòu)造器,它會(huì)執(zhí)行一個(gè)類型轉(zhuǎn)換。
Object ( [ value ] )
當(dāng)以一個(gè)參數(shù) value 或者無參數(shù)調(diào)用 Object 函數(shù),采用如下步驟:
- 如果 value 是 null, undefined 或未指定,則創(chuàng)建并返回一個(gè)新 Object 對(duì)象 , 這個(gè)對(duì)象與仿佛用相同參數(shù)調(diào)用標(biāo)準(zhǔn)內(nèi)置的 Object 構(gòu)造器 (15.2.2.1) 的結(jié)果一樣 .
- 返回 ToObject(value).
Object 構(gòu)造器
當(dāng) Object 是 new 表達(dá)式調(diào)用的一部分時(shí),它是一個(gè)構(gòu)造器,可創(chuàng)建一個(gè)對(duì)象。
new Object ( [ value ] )
當(dāng)以一個(gè)參數(shù) value 或者無參數(shù)調(diào)用 Object 構(gòu)造器,采用如下步驟:
- 如果提供了 value, 則如果 Type(value) 是 Object, 則如果 value 是個(gè)原生 ECMAScript 對(duì)象 , 不創(chuàng)建新對(duì)象,簡單的返回 value.如果 value 是宿主對(duì)象 , 則采取動(dòng)作和返回依賴實(shí)現(xiàn)的結(jié)果的方式可以使依賴于宿主對(duì)象的 .如果 Type(value) 是 String, 返回 ToObject(value).如果 Type(value) 是 Boolean, 返回 ToObject(value).如果 Type(value) 是 Number, 返回 ToObject(value).
- 斷言 : 未提供參數(shù) value 或其類型是 Null 或 Undefined.
- 令 obj 為一個(gè)新創(chuàng)建的原生 ECMAScript 對(duì)象 .
- 設(shè)定 obj 的 [[Prototype]] 內(nèi)部屬性為標(biāo)準(zhǔn)內(nèi)置的 Object 的 prototype 對(duì)象 (15.2.4).
- 設(shè)定 obj 的 [[Class]] 內(nèi)部屬性為 "Object".
- 設(shè)定 obj 的 [[Extensible]] 內(nèi)部屬性為 true.
- 設(shè)定 obj 的 8.12 指定的所有內(nèi)部方法
- 返回 obj.
Object 構(gòu)造器的屬性
Object 構(gòu)造器的 [[Prototype]] 內(nèi)部屬性值是標(biāo)準(zhǔn)內(nèi)置 Function 的 prototype 對(duì)象。
除了內(nèi)部屬性和 length 屬性(其值是 1)之外,Object 構(gòu)造器擁有以下屬性:
Object.prototype
Object.prototype 的初始值是標(biāo)準(zhǔn)內(nèi)置 Object 的 prototype 對(duì)象(15.2.4)。
這個(gè)屬性包含特性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
Object.getPrototypeOf ( O )
當(dāng)以參數(shù) O 調(diào)用 getPrototypeOf 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 返回 O 的 [[Prototype]] 內(nèi)部屬性的值 .
Object.getOwnPropertyDescriptor ( O, P )
當(dāng)調(diào)用 getOwnPropertyDescriptor 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 令 name 為 ToString(P).
- 令 desc 為以參數(shù) name 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
- 返回調(diào)用 FromPropertyDescriptor(desc) 的結(jié)果 (8.10.4).
Object.getOwnPropertyNames ( O )
當(dāng)調(diào)用 getOwnPropertyNames 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 令 array 為仿佛是用表達(dá)式 new Array () 創(chuàng)建新對(duì)象的結(jié)果,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
- 令 n 為 0.
- 對(duì) O 的每個(gè)自身屬性 P令 name 為值是 P 的名稱的字符串 .以 ToString(n) 和屬性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 為參數(shù)調(diào)用 array 的 [[DefineOwnProperty]] 內(nèi)部方法 .n 遞增 1.
- 返回 array.
如果 O 是一個(gè)字符串實(shí)例,第 4 步處理的自身屬性集合包含 15.5.5.2 定義的隱藏屬性,他們對(duì)應(yīng)對(duì)象的 [[PrimitiveValue]] 字符串中相應(yīng)位置的字符。
Object.create ( O [, Properties] )
create 函數(shù)按照指定的原型創(chuàng)建一個(gè)新對(duì)象。當(dāng)調(diào)用 create 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object 或 Null,則拋出一個(gè) TypeError 異常 .
- 令 obj 為為仿佛是用表達(dá)式 new Object() 創(chuàng)建新對(duì)象的結(jié)果,這里的 Object 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
- 設(shè)定 obj 的 [[Prototype]] 內(nèi)部屬性為 O.
- 如果傳入了 Properties 參數(shù)并且不是 undefined, 則仿佛是用 obj 和 Properties 當(dāng)作參數(shù)調(diào)用標(biāo)準(zhǔn)內(nèi)置函數(shù) Object.defineProperties 一樣給 obj 添加自身屬性。
- 返回 obj.
Object.defineProperty ( O, P, Attributes )
defineProperty 函數(shù)用于給一個(gè)對(duì)象添加一個(gè)自身屬性 并 / 或 更新現(xiàn)有自身屬性的特性。當(dāng)調(diào)用 defineProperty 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 令 name 為 ToString(P).
- 令 desc 為以 Attributes 作為參數(shù)調(diào)用 ToPropertyDescriptor 的結(jié)果 .
- 以 name, desc, true 作為參數(shù)調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
- 返回 O.
Object.defineProperties ( O, Properties )
defineProperties 函數(shù)用于給一個(gè)對(duì)象添加一些自身屬性 并 / 或 更新現(xiàn)有的一些自身屬性的特性。當(dāng)調(diào)用 defineProperties 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 令 props 為 ToObject(Properties).
- 令 names 為一個(gè)內(nèi)部列表,它包含 props 的每個(gè)可遍歷自身屬性的名稱 .
- 令 descriptors 為一個(gè)空的內(nèi)部列表 .
- 對(duì) names 的每個(gè)元素 P,按照列表順序 ,令 descObj 為以 P 作為參數(shù)調(diào)用 props 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 desc 為以 descObj 作為參數(shù)調(diào)用 ToPropertyDescriptor 的結(jié)果 .將 desc 插入 descriptors 的尾部 .
- 對(duì) descriptors 的每個(gè)元素 desc,按照列表順序 ,以參數(shù) P, desc, true 調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
- 返回 O
如果一個(gè)實(shí)現(xiàn)為 for-in 語句的定義了特定的枚舉順序,那么在這個(gè)算法的第 3 步中的列表元素必須也用相同的順序排列。
Object.seal ( O )
當(dāng)調(diào)用 seal 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 對(duì) O 的每個(gè)命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 desc.[[Configurable]] 是 true, 設(shè)定 desc.[[Configurable]] 為 false.以 P, desc, true 為參數(shù)調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
- 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
- 返回 O.
Object.freeze ( O )
當(dāng)調(diào)用 freeze 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 對(duì) O 的每個(gè)命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 IsDataDescriptor(desc) 是 true, 則如果 desc.[[Writable]] 是 true, 設(shè)定 desc.[[Writable]] 為 false.如果 desc.[[Configurable]] 是 true, 設(shè)定 desc.[[Configurable]] 為 false.以 P, desc, true 作為參數(shù)調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
- 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
- 返回 O.
Object.preventExtensions ( O )
當(dāng)調(diào)用 preventExtensions 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
- 返回 O.
Object.isSealed ( O )
當(dāng)以參數(shù) O 調(diào)用 isSealed 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 對(duì) O 的每個(gè)命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 desc.[[Configurable]] 是 true, 則返回 false.
- 如果 O 的 [[Extensible]] 內(nèi)部屬性是 false, 則返回 true.
- 否則 , 返回 false.
Object.isFrozen ( O )
當(dāng)以參數(shù) O 調(diào)用 isFrozen 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 對(duì) O 的每個(gè)命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 IsDataDescriptor(desc) 是 true,則如果 desc.[[Writable]] 是 true, 則返回 false.如果 desc.[[Configurable]] 是 true, 則返回 false.
- 如果 O 的 [[Extensible]] 內(nèi)部屬性是 false, 則返回 true.
- 否則 , 返回 false.
Object.isExtensible ( O )
當(dāng)以參數(shù) O 調(diào)用 isExtensible 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 返回 O 的 [[Extensible]] 內(nèi)部屬性布爾值 .
Object.keys ( O )
當(dāng)以參數(shù) O 調(diào)用 keys 函數(shù),采用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個(gè) TypeError 異常 .
- 令 n 為 O 的可遍歷自身屬性的個(gè)數(shù)
- 令 array 為仿佛是用表達(dá)式 new Array () 創(chuàng)建新對(duì)象的結(jié)果,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
- 令 index 為 0.
- 對(duì) O 的每個(gè)可遍歷自身屬性名 P,以 ToString(index),屬性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作為參數(shù)調(diào)用 array 的 [[DefineOwnProperty]] 內(nèi)部方法。index 遞增 1.
- 返回 array.
如果一個(gè)實(shí)現(xiàn)為 for-in 語句的定義了特定的枚舉順序,那么在這個(gè)算法的第 5 步中的必須使用相同的枚舉順序。
Object 的 prototype 對(duì)象的屬性
Object 的 prototype 對(duì)象的 [[Prototype]] 內(nèi)部屬性的值是 null,[[Class]] 內(nèi)部屬性的值是 "Object",[[Extensible]] 內(nèi)部屬性的初始值是 true。
Object.prototype.constructor
Object.prototype.constructor 的初始值是標(biāo)準(zhǔn)內(nèi)置的 Object 構(gòu)造器。
Object.prototype.toString ( )
當(dāng)調(diào)用 toString 方法,采用如下步驟:
- 如果 this 的值是 undefined, 返回 "[object Undefined]".
- 如果 this 的值是 null, 返回 "[object Null]".
- 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 class 為 O 的 [[Class]] 內(nèi)部屬性的值 .
- 返回三個(gè)字符串 "[object ", class, and "]" 連起來的字符串 .
Object.prototype.toLocaleString ( )
當(dāng)調(diào)用 toLocaleString 方法,采用如下步驟:
- 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 toString 為以 "toString" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 如果 IsCallable(toString) 是 false, 拋出一個(gè) TypeError 異常 .
- 返回以 O 作為 this 值,無參數(shù)調(diào)用 toString 的 [[Call]] 內(nèi)部方法的結(jié)果 .
這個(gè)函數(shù)給所有 Object 對(duì)象提供一個(gè)通用的 toLocaleString 接口,即使并不是所有的都使用它。目前,Array, Number, Date 提供了它們自身的語言環(huán)境敏感的 toLocaleString 方法。
這個(gè)函數(shù)的第一個(gè)參數(shù)可能會(huì)在此標(biāo)準(zhǔn)的未來版本中使用到;因此建議實(shí)現(xiàn)不要用這個(gè)位置參數(shù)來做其他事情。
Object.prototype.valueOf ( )
當(dāng)調(diào)用 valueOf 方法,采用如下步驟:
- 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 如果 O 是以一個(gè)宿主對(duì)象 (15.2.2.1) 為參數(shù)調(diào)用 Object 構(gòu)造器的結(jié)果,則返回 O 或傳遞給構(gòu)造器的原來的宿主對(duì)象 . 返回的具體結(jié)果是由實(shí)現(xiàn)定義的 .
- 返回 O.
Object.prototype.hasOwnProperty (V)
當(dāng)以參數(shù) V 調(diào)用 hasOwnProperty 方法,采用如下步驟:
- 令 P 為 ToString(V).
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 desc 為以 P 為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
- 如果 desc 是 undefined, 返回 false.
- 返回 true.
不像 [[HasProperty]](8.12.6),這個(gè)方法不考慮原形鏈中的對(duì)象。
為步驟 1 和 2 的選擇這樣的順序,是為了確保在本規(guī)范之前版本中會(huì)在這里的步驟 1 里拋出的任何異常,即使 this 值是 undefined 或 null,也會(huì)繼續(xù)拋出。
Object.prototype.isPrototypeOf (V)
當(dāng)以參數(shù) V 調(diào)用 isPrototypeOf 方法,采用如下步驟:
- 如果 V 不是個(gè)對(duì)象 , 返回 false.
- 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 重復(fù)令 V 為 V 的 [[Prototype]] 內(nèi)部屬性的值 .如果 V 是 null, 返回 false如果 O 和 V 指向同一個(gè)對(duì)象 , 返回 true.
為步驟 1 和 2 的選擇這樣的順序,是為了當(dāng) V 不是對(duì)象并且 this 值是 undefined 或 null 時(shí)能夠保持本規(guī)范之前版本指定的行為。
Object.prototype.propertyIsEnumerable (V)
當(dāng)以參數(shù) V 調(diào)用 propertyIsEnumerable 方法,采用如下步驟:
- 令 P 為 ToString(V).
- 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 desc 為以 P 作為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
- 如果 desc 是 undefined, 返回 false.
- 返回 desc.[[Enumerable]] 的值 .
這個(gè)方法不考慮原型鏈中的對(duì)象。
為步驟 1 和 2 的選擇這樣的順序,是為了確保在本規(guī)范之前版本中會(huì)在這里的步驟 1 里拋出的任何異常,即使 this 值是 undefined 或 null,也會(huì)繼續(xù)拋出。
Object 的實(shí)例的屬性
Object 的實(shí)例除了擁從 Object 的 prototype 對(duì)象繼承來的屬性之外不包含特殊的屬性。
更多建議: