屬性描述符及屬性標(biāo)識(shí)符規(guī)范類型

2018-06-16 15:07 更新

屬性描述符類型是用來解釋命名屬性的具體的操作的特性集。屬性描述符類型的值是記錄項(xiàng),由命名字段組成,每個(gè)字段的名稱是一個(gè)特性名并且它的值是一個(gè)相應(yīng)的特性值,這些特性指定在 8.6.1。此外,任何字段都可能存在或不存在。

 根據(jù)是否存在或使用了某些字段,屬性描述符的值可進(jìn)一步劃分為數(shù)據(jù)屬性描述符和訪問器屬性描述符。一個(gè)數(shù)據(jù)屬性描述符 里包括叫做 [[Value]] 或 [[Writable]] 的字段。一個(gè)訪問器屬性描述符里包括叫做 [[Get]] 或 [[Set]] 的字段。任何屬性描述都可能有名為 [[Enumerable]] 和 [[Configurable]] 的字段。一個(gè)屬性描述符不能同時(shí)是數(shù)據(jù)屬性描述符和訪問器屬性描述符;但是,它可能二者都不是。一個(gè)通用屬性描述符是,既不是數(shù)據(jù)屬性描述符也不是訪問器屬性描述符的屬性描述符值。一個(gè)完全填充屬性描述符是訪問器屬性描述符或數(shù)據(jù)屬性描述符,并且擁有 8.6.1 Table 5 或 Table 6 里定義的所有屬性特性對(duì)應(yīng)的字段。

 本規(guī)范中為了便于標(biāo)記,使用一種類似對(duì)象字面量的語法來定義屬性描述符。例如,屬性描述符 {[[Value]]: 42, [[Writable]]: false, [[Configurable]]: true},就定義了一個(gè)數(shù)據(jù)屬性描述符。字段名稱的順序并不重要。任何沒有明確列出的字段被認(rèn)為是不存在的。

 在規(guī)范中的文本和算法里,可用點(diǎn)符號(hào)來指明一個(gè)屬性描述符的特定字段。例如,如果 D 是一個(gè)屬性描述符,那么 D.[[Value]] 是“D 的 [[Value]] 字段”的簡(jiǎn)寫。

 屬性標(biāo)識(shí)符類型用于關(guān)聯(lián)屬性名稱與屬性描述符。屬性標(biāo)識(shí)符類型的值是 (name, descriptor) 形式的一對(duì)值,其中 name 是一個(gè)字符串和 descriptor 是一個(gè)屬性描述符值。

 在本規(guī)范中使用以下的抽象操作來操作屬性描述符值:

IsAccessorDescriptor (Desc)

 當(dāng)用屬性描述 Desc 調(diào)用抽象操作 IsAccessorDescriptor,采用以下步驟:

  1. 如果 Desc 是 undefined,那么返回 false。
  2. 如果 Desc.[[Get]] 和 Desc.[[Set]] 都不存在,則返回 false。
  3. 返回 true。

IsDataDescriptor (Desc)

 當(dāng)用屬性描述 Desc 調(diào)用抽象操作 IsDataDescriptor,采用以下步驟:

  1. 如果 Desc 是 undefined,那么返回 false。
  2. 如果 Desc.[[Value]] 和 Desc.[[Writable]] 都不存在,則返回 false。
  3. 返回 true。

IsGenericDescriptor (Desc)

 當(dāng)用屬性描述 Desc 調(diào)用抽象操作 IsDataDescriptor,采用以下步驟:

  1. 如果 Desc 是 undefined,那么返回 false。
  2. 如果 IsAccessorDescriptor(Desc) 和 IsDataDescriptor(Desc) 都是 false, 則返回 true。
  3. 返回 false。

FromPropertyDescriptor (Desc)

 當(dāng)用屬性描述 Desc 調(diào)用抽象操作 FromPropertyDescriptor,采用以下步驟:

 假定以下算法的 Desc 是 [[GetOwnProperty]]( 見 8.12.1) 返回的完全填充的 屬性描述。

  1. 如果 Desc 是 undefined,那么返回 false。
  2. 令 obj 為仿佛使用 new Object() 表達(dá)式創(chuàng)建的新對(duì)象,這里的 Object 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
  3. 如果 IsDataDescriptor(Desc) 是 true,則用參數(shù) "value", 屬性描述符 {[[Value]]: Desc.[[Value]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。用參數(shù) "writable", 屬性描述符 {[[Value]]: Desc.[[Writable]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。
  4. 否則,IsAccessorDescriptor(Desc) 必定是 true,所以用參數(shù) "get", 屬性描述符 {[[Value]]: Desc.[[Get]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。用參數(shù) "set", 屬性描述符 {[[Value]]: Desc.[[Set]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。
  5. 用參數(shù) "enumerable", 屬性描述符 {[[Value]]: Desc.[[Enumerable]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。
  6. 用參數(shù) "configurable", 屬性描述符 {[[Value]]: Desc.[[Configurable]], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, false 調(diào)用 obj 的 [[DefineOwnProperty]] 內(nèi)部方法。
  7. 返回 obj。

ToPropertyDescriptor (Obj)

 當(dāng)用對(duì)象 Desc 調(diào)用抽象操作 FromPropertyDescriptor,采用以下步驟:

  1. 如果 Type(Obj) 不是 Object,拋出一個(gè) TypeError 異常。
  2. 令 desc 為創(chuàng)建初始不包含字段的新屬性描述的結(jié)果。
  3. 如果用參數(shù) "enumerable" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 enum 為用參數(shù) "enumerable" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。設(shè)定 desc 的 [[Enumerable]] 字段為 ToBoolean(enum)。
  4. 如果參數(shù) "configurable" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 conf 為用參數(shù) "enumerable" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。設(shè)定 desc 的 [[Configurable]] 字段為 ToBoolean(conf)。
  5. 如果參數(shù) "value" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 value 為用參數(shù) "value" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。設(shè)定 desc 的 [[Value]] 字段為 value。
  6. 如果參數(shù) "writable" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 writable 為用參數(shù) "writable" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。設(shè)定 desc 的 [[Writable]] 字段為 ToBoolean(writable)。
  7. 如果參數(shù) "get" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 getter 為用參數(shù) "get" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。如果 IsCallable(getter) 是 false 并且 getter 不是 undefined,則拋出一個(gè) TypeError 異常。設(shè)定 desc 的 [[Get]] 字段為 getter。
  8. 如果參數(shù) "set" 調(diào)用 Obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true,則令 setter 為用參數(shù) "set" 調(diào)用 Obj 的 [[Get]] 內(nèi)部方法的結(jié)果。如果 IsCallable(setter) 是 false 并且 setter 不是 undefined,則拋出一個(gè) TypeError 異常。設(shè)定 desc 的 [[Set]] 字段為 Setter。
  9. 如果存在 desc.[[Get]] 或 desc.[[Set]],則如果存在 desc.[[Value]] 或 desc.[[Writable]],則拋出一個(gè) TypeError 異常。
  10. 返回 desc


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)