Object 對象

2018-06-16 15:27 更新

作為函數(shù)調(diào)用 Object 構(gòu)造器

 當把 Object 當做一個函數(shù)來調(diào)用,而不是一個構(gòu)造器,它會執(zhí)行一個類型轉(zhuǎn)換。

Object ( [ value ] )

 當以一個參數(shù) value 或者無參數(shù)調(diào)用 Object 函數(shù),采用如下步驟:

  1. 如果 value 是 null, undefined 或未指定,則創(chuàng)建并返回一個新 Object 對象 , 這個對象與仿佛用相同參數(shù)調(diào)用標準內(nèi)置的 Object 構(gòu)造器 (15.2.2.1) 的結(jié)果一樣 .
  2. 返回 ToObject(value).

Object 構(gòu)造器

 當 Object 是 new 表達式調(diào)用的一部分時,它是一個構(gòu)造器,可創(chuàng)建一個對象。

new Object ( [ value ] )

 當以一個參數(shù) value 或者無參數(shù)調(diào)用 Object 構(gòu)造器,采用如下步驟:

  1. 如果提供了 value, 則如果 Type(value) 是 Object, 則如果 value 是個原生 ECMAScript 對象 , 不創(chuàng)建新對象,簡單的返回 value.如果 value 是宿主對象 , 則采取動作和返回依賴實現(xiàn)的結(jié)果的方式可以使依賴于宿主對象的 .如果 Type(value) 是 String, 返回 ToObject(value).如果 Type(value) 是 Boolean, 返回 ToObject(value).如果 Type(value) 是 Number, 返回 ToObject(value).
  2. 斷言 : 未提供參數(shù) value 或其類型是 Null 或 Undefined.
  3. 令 obj 為一個新創(chuàng)建的原生 ECMAScript 對象 .
  4. 設(shè)定 obj 的 [[Prototype]] 內(nèi)部屬性為標準內(nèi)置的 Object 的 prototype 對象 (15.2.4).
  5. 設(shè)定 obj 的 [[Class]] 內(nèi)部屬性為 "Object".
  6. 設(shè)定 obj 的 [[Extensible]] 內(nèi)部屬性為 true.
  7. 設(shè)定 obj 的 8.12 指定的所有內(nèi)部方法
  8. 返回 obj.

Object 構(gòu)造器的屬性

 Object 構(gòu)造器的 [[Prototype]] 內(nèi)部屬性值是標準內(nèi)置 Function 的 prototype 對象。

 除了內(nèi)部屬性和 length 屬性(其值是 1)之外,Object 構(gòu)造器擁有以下屬性:

Object.prototype

 Object.prototype 的初始值是標準內(nèi)置 Object 的 prototype 對象(15.2.4)。

 這個屬性包含特性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

Object.getPrototypeOf ( O )

 當以參數(shù) O 調(diào)用 getPrototypeOf 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 返回 O 的 [[Prototype]] 內(nèi)部屬性的值 .

Object.getOwnPropertyDescriptor ( O, P )

 當調(diào)用 getOwnPropertyDescriptor 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 令 name 為 ToString(P).
  3. 令 desc 為以參數(shù) name 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
  4. 返回調(diào)用 FromPropertyDescriptor(desc) 的結(jié)果 (8.10.4).

Object.getOwnPropertyNames ( O )

 當調(diào)用 getOwnPropertyNames 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 令 array 為仿佛是用表達式 new Array () 創(chuàng)建新對象的結(jié)果,這里的 Array 是標準內(nèi)置構(gòu)造器名。
  3. 令 n 為 0.
  4. 對 O 的每個自身屬性 P令 name 為值是 P 的名稱的字符串 .以 ToString(n) 和屬性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 為參數(shù)調(diào)用 array 的 [[DefineOwnProperty]] 內(nèi)部方法 .n 遞增 1.
  5. 返回 array.

 如果 O 是一個字符串實例,第 4 步處理的自身屬性集合包含 15.5.5.2 定義的隱藏屬性,他們對應對象的 [[PrimitiveValue]] 字符串中相應位置的字符。

Object.create ( O [, Properties] )

 create 函數(shù)按照指定的原型創(chuàng)建一個新對象。當調(diào)用 create 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object 或 Null,則拋出一個 TypeError 異常 .
  2. 令 obj 為為仿佛是用表達式 new Object() 創(chuàng)建新對象的結(jié)果,這里的 Object 是標準內(nèi)置構(gòu)造器名。
  3. 設(shè)定 obj 的 [[Prototype]] 內(nèi)部屬性為 O.
  4. 如果傳入了 Properties 參數(shù)并且不是 undefined, 則仿佛是用 obj 和 Properties 當作參數(shù)調(diào)用標準內(nèi)置函數(shù) Object.defineProperties 一樣給 obj 添加自身屬性。
  5. 返回 obj.

Object.defineProperty ( O, P, Attributes )

 defineProperty 函數(shù)用于給一個對象添加一個自身屬性 并 / 或 更新現(xiàn)有自身屬性的特性。當調(diào)用 defineProperty 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 令 name 為 ToString(P).
  3. 令 desc 為以 Attributes 作為參數(shù)調(diào)用 ToPropertyDescriptor 的結(jié)果 .
  4. 以 name, desc, true 作為參數(shù)調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
  5. 返回 O.

Object.defineProperties ( O, Properties )

 defineProperties 函數(shù)用于給一個對象添加一些自身屬性 并 / 或 更新現(xiàn)有的一些自身屬性的特性。當調(diào)用 defineProperties 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 令 props 為 ToObject(Properties).
  3. 令 names 為一個內(nèi)部列表,它包含 props 的每個可遍歷自身屬性的名稱 .
  4. 令 descriptors 為一個空的內(nèi)部列表 .
  5. 對 names 的每個元素 P,按照列表順序 ,令 descObj 為以 P 作為參數(shù)調(diào)用 props 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 desc 為以 descObj 作為參數(shù)調(diào)用 ToPropertyDescriptor 的結(jié)果 .將 desc 插入 descriptors 的尾部 .
  6. 對 descriptors 的每個元素 desc,按照列表順序 ,以參數(shù) P, desc, true 調(diào)用 O 的 [[DefineOwnProperty]] 內(nèi)部方法 .
  7. 返回 O

 如果一個實現(xiàn)為 for-in 語句的定義了特定的枚舉順序,那么在這個算法的第 3 步中的列表元素必須也用相同的順序排列。

Object.seal ( O )

 當調(diào)用 seal 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 對 O 的每個命名自身屬性名 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)部方法 .
  3. 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
  4. 返回 O.

Object.freeze ( O )

 當調(diào)用 freeze 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 對 O 的每個命名自身屬性名 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)部方法 .
  3. 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
  4. 返回 O.

Object.preventExtensions ( O )

 當調(diào)用 preventExtensions 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 設(shè)定 O 的 [[Extensible]] 內(nèi)部屬性為 false.
  3. 返回 O.

Object.isSealed ( O )

 當以參數(shù) O 調(diào)用 isSealed 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 對 O 的每個命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 desc.[[Configurable]] 是 true, 則返回 false.
  3. 如果 O 的 [[Extensible]] 內(nèi)部屬性是 false, 則返回 true.
  4. 否則 , 返回 false.

Object.isFrozen ( O )

 當以參數(shù) O 調(diào)用 isFrozen 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 對 O 的每個命名自身屬性名 P,令 desc 為以參數(shù) P 調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .如果 IsDataDescriptor(desc) 是 true,則如果 desc.[[Writable]] 是 true, 則返回 false.如果 desc.[[Configurable]] 是 true, 則返回 false.
  3. 如果 O 的 [[Extensible]] 內(nèi)部屬性是 false, 則返回 true.
  4. 否則 , 返回 false.

Object.isExtensible ( O )

 當以參數(shù) O 調(diào)用 isExtensible 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 返回 O 的 [[Extensible]] 內(nèi)部屬性布爾值 .

Object.keys ( O )

 當以參數(shù) O 調(diào)用 keys 函數(shù),采用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
  2. 令 n 為 O 的可遍歷自身屬性的個數(shù)
  3. 令 array 為仿佛是用表達式 new Array () 創(chuàng)建新對象的結(jié)果,這里的 Array 是標準內(nèi)置構(gòu)造器名。
  4. 令 index 為 0.
  5. 對 O 的每個可遍歷自身屬性名 P,以 ToString(index),屬性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作為參數(shù)調(diào)用 array 的 [[DefineOwnProperty]] 內(nèi)部方法。index 遞增 1.
  6. 返回 array.

 如果一個實現(xiàn)為 for-in 語句的定義了特定的枚舉順序,那么在這個算法的第 5 步中的必須使用相同的枚舉順序。

Object 的 prototype 對象的屬性

 Object 的 prototype 對象的 [[Prototype]] 內(nèi)部屬性的值是 null,[[Class]] 內(nèi)部屬性的值是 "Object",[[Extensible]] 內(nèi)部屬性的初始值是 true。

Object.prototype.constructor

 Object.prototype.constructor 的初始值是標準內(nèi)置的 Object 構(gòu)造器。

Object.prototype.toString ( )

 當調(diào)用 toString 方法,采用如下步驟:

  1. 如果 this 的值是 undefined, 返回 "[object Undefined]".
  2. 如果 this 的值是 null, 返回 "[object Null]".
  3. 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  4. 令 class 為 O 的 [[Class]] 內(nèi)部屬性的值 .
  5. 返回三個字符串 "[object ", class, and "]" 連起來的字符串 .

Object.prototype.toLocaleString ( )

 當調(diào)用 toLocaleString 方法,采用如下步驟:

  1. 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  2. 令 toString 為以 "toString" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
  3. 如果 IsCallable(toString) 是 false, 拋出一個 TypeError 異常 .
  4. 返回以 O 作為 this 值,無參數(shù)調(diào)用 toString 的 [[Call]] 內(nèi)部方法的結(jié)果 .

 這個函數(shù)給所有 Object 對象提供一個通用的 toLocaleString 接口,即使并不是所有的都使用它。目前,Array, Number, Date 提供了它們自身的語言環(huán)境敏感的 toLocaleString 方法。

 這個函數(shù)的第一個參數(shù)可能會在此標準的未來版本中使用到;因此建議實現(xiàn)不要用這個位置參數(shù)來做其他事情。

Object.prototype.valueOf ( )

 當調(diào)用 valueOf 方法,采用如下步驟:

  1. 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  2. 如果 O 是以一個宿主對象 (15.2.2.1) 為參數(shù)調(diào)用 Object 構(gòu)造器的結(jié)果,則返回 O 或傳遞給構(gòu)造器的原來的宿主對象 . 返回的具體結(jié)果是由實現(xiàn)定義的 .
  3. 返回 O.

Object.prototype.hasOwnProperty (V)

 當以參數(shù) V 調(diào)用 hasOwnProperty 方法,采用如下步驟:

  1. 令 P 為 ToString(V).
  2. 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  3. 令 desc 為以 P 為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
  4. 如果 desc 是 undefined, 返回 false.
  5. 返回 true.

 不像 [[HasProperty]](8.12.6),這個方法不考慮原形鏈中的對象。

 為步驟 1 和 2 的選擇這樣的順序,是為了確保在本規(guī)范之前版本中會在這里的步驟 1 里拋出的任何異常,即使 this 值是 undefined 或 null,也會繼續(xù)拋出。

Object.prototype.isPrototypeOf (V)

 當以參數(shù) V 調(diào)用 isPrototypeOf 方法,采用如下步驟:

  1. 如果 V 不是個對象 , 返回 false.
  2. 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  3. 重復令 V 為 V 的 [[Prototype]] 內(nèi)部屬性的值 .如果 V 是 null, 返回 false如果 O 和 V 指向同一個對象 , 返回 true.

 為步驟 1 和 2 的選擇這樣的順序,是為了當 V 不是對象并且 this 值是 undefined 或 null 時能夠保持本規(guī)范之前版本指定的行為。

Object.prototype.propertyIsEnumerable (V)

 當以參數(shù) V 調(diào)用 propertyIsEnumerable 方法,采用如下步驟:

  1. 令 P 為 ToString(V).
  2. 令 O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
  3. 令 desc 為以 P 作為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果 .
  4. 如果 desc 是 undefined, 返回 false.
  5. 返回 desc.[[Enumerable]] 的值 .

 這個方法不考慮原型鏈中的對象。

 為步驟 1 和 2 的選擇這樣的順序,是為了確保在本規(guī)范之前版本中會在這里的步驟 1 里拋出的任何異常,即使 this 值是 undefined 或 null,也會繼續(xù)拋出。

Object 的實例的屬性

 Object 的實例除了擁從 Object 的 prototype 對象繼承來的屬性之外不包含特殊的屬性。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號