Object 內(nèi)部屬性及方法

2018-06-16 15:04 更新

本規(guī)范使用各種內(nèi)部屬性來定義對象值的語義。這些內(nèi)部屬性不是 ECMAScript 語言的一部分。本規(guī)范中純粹是以說明為目的定義它們。ECMAScript 實現(xiàn)必須表現(xiàn)為仿佛它被這里描述的內(nèi)部屬性產(chǎn)生和操作。內(nèi)部屬性的名字用閉合雙方括號 括起來。如果一個算法使用一個對象的一個內(nèi)部屬性,并且此對象沒有實現(xiàn)需要的內(nèi)部屬性,那么拋出TypeError 異常。


表 8 總結(jié)了本規(guī)范中適用于所有 ECMAScript 對象的內(nèi)部屬性。表 9 總結(jié)了本規(guī)范中適用于某些 ECMAScript 對象的內(nèi)部屬性。這些表中的描述如果沒有特別指出是特定的原生 ECMAScript 對象,那么就說明了其在原生 ECMAScript 對象中的行為。宿主對象的內(nèi)部屬性可以支持任何依賴于實現(xiàn)的行為,只要其與本文檔說的宿主對象的個別限制一直。


下面表的“值的類域”一列定義了內(nèi)部屬性關(guān)聯(lián)值的類型。類型名稱參考第 8 章定義的類型,作為增強添加了一下名稱:“any”指值可以是任何 ECMAScript 語言類型;“primitive”指 Undefined, Null, Boolean, String, , Number;“SpecOp”指內(nèi)部屬性是一個內(nèi)部方法,一個抽象操作規(guī)范定義一個實現(xiàn)提供它的步驟?!癝pecOp”后面跟著描述性參數(shù)名的列表。如果參數(shù)名和類型名一致那么這個名字用于描述參數(shù)的類型。如果“SpecOp”有返回值,那么這個參數(shù)列表后跟著“→”符號和返回值的類型。


遍8——所有對象共有的內(nèi)部屬性
內(nèi)部屬性取值范圍說明
[[Prototype]]Object 或 Null此對象的原型
[[Class]]String說明規(guī)范定義的對象分類的一個字符串值
[[Extensible]]Boolean如果是 true,可以向?qū)ο筇砑幼陨韺傩浴?/td>
[[Get]]SpecOp(propertyName) → any返回命名屬性的值
[[GetOwnProperty]]SpecOp (propertyName) → Undefined 或 Property Descriptor返回此對象的自身命名屬性的屬性描述,如果不存在返回 undefined
[[GetProperty]]SpecOp (propertyName) → Undefined 或 Property Descriptor返回此對象的完全填入的自身命名屬性的屬性描述,如果不存在返回 undefined
[[Put]]SpecOp (propertyName, any, Boolean)將指定命名屬性設(shè)為第二個參數(shù)的值。flog 控制失敗處理。
[[CanPut]]SpecOp (propertyName) → Boolean返回一個 Boolean 值,說明是否可以在 PropertyName 上執(zhí)行 [[Put]] 操作。
[[HasProperty]]SpecOp (propertyName) → Boolean返回一個 Boolean 值,說明對象是否含有給定名稱的屬性。
[[Delete]]SpecOp (propertyName, Boolean) → Boolean從對象上刪除指定的自身命名屬性。flog 控制失敗處理。
[[DefaultValue]]SpecOp (Hint) → primitiveHint 是一個字符串。返回對象的默認值
[[DefineOwnProperty]]SpecOp (propertyName, PropertyDescriptor, Boolean) → Boolean創(chuàng)建或修改自身命名屬性為擁有屬性描述里描述的狀態(tài)。flog 控制失敗處理。


所有對象(包括宿主對象)必須實現(xiàn)表 8 中列出的所有內(nèi)部屬性。然而,對某些對象的 [[DefaultValue]] 內(nèi)部方法,可以簡單的拋出 TypeError 異常。


所有對象都有一個叫做 [[Prototype]] 的內(nèi)部屬性。此對象的值是 null 或一個對象,并且它用于實現(xiàn)繼承。一個原生屬性是否可以把宿主對象作為它的 [[Prototype]] 取決于實現(xiàn)。所有 [[Prototype]] 鏈必須是有限長度(即,從任何對象開始,遞歸訪問 [[Prototype]] 內(nèi)部屬性必須最終到頭,并且值是 null)。從 [[Prototype]] 對象繼承來的命名數(shù)據(jù)屬性(作為子對象的屬性可見)是為了 get 請求,但無法用于 put 請求。命名訪問器屬性會把 get 和 put 請求都繼承。


所有 ECMASCript 對象都有一個 Boolean 值的 [[Extensible]] 內(nèi)部屬性,它控制是否可以給對象添加命名屬性。如果 [[Extensible]] 內(nèi)部屬性的值是 false 那么不得給對象添加命名屬性。此外,如果 [[Extensible]] 是 false 那么不得更改對象的 [[Class]] 和 [[Prototype]] 內(nèi)部屬性的值。一旦 [[Extensible]] 內(nèi)部屬性的值設(shè)為 false 之后無法再更改為 true。


本規(guī)范的定義中沒有 ECMAScript 語言運算符或內(nèi)置函數(shù)允許一個程序更改對象的 [[Class]] 或 [[Prototype]] 內(nèi)部屬性或把 [[Extensible]] 的值從 false 更改成 true。實現(xiàn)中修改 [[Class]], [[Prototype]], [[Extensible]] 的個別擴展必須不違反前一段定義的不變量。


本規(guī)范的每種內(nèi)置對象都定義了 [[Class]] 內(nèi)部屬性的值。宿主對象的 [[Class]] 內(nèi)部屬性的值可以是除了 "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String" 的任何字符串。[[Class]] 內(nèi)部屬性的值用于內(nèi)部區(qū)分對象的種類。注,本規(guī)范中除了通過 Object.prototype.toString ( 見 15.2.4.2) 沒有提供任何手段使程序訪問此值。


除非特別指出,原生 ECMAScrpit 對象的公共內(nèi)部方法的行為描述在 8.12。Array 對象的 [[DefineOwnProperty]] 內(nèi)部方法有稍不同的實現(xiàn)(見 15.4.5.1),又有 String 對象的 [[GetOwnProperty]] 內(nèi)部方法有稍不同的實現(xiàn)(見 15.5.5.2)。Arguments 對象(10.6)的 [[Get]],[[GetOwnProperty]],[[DefineOwnProperty]],[[Delete]] 有不同的實現(xiàn)。Function 對象(15.3)的 [[Get]] 的有不同的實現(xiàn)。


除非特別指出,宿主對象可以以任何方式實現(xiàn)這些內(nèi)部方法,一種可能是一個特別的宿主對象的 [[Get]] 和 [[Put]] 確實可以存取屬性值,但 [[HasProperty]] 總是產(chǎn)生 false。然而,如果任何對宿主對象內(nèi)部屬性的操作不被實現(xiàn)支持,那么當試圖操作時必須拋出 TypeError 異常。


宿主對象的 [[GetOwnProperty]] 內(nèi)部方法必須符合宿主對象每個屬性的以下不變量 :

  • 如果屬性是描述過的數(shù)據(jù)屬性,并隨著時間的推移,它可能返回不同的值,那么即使沒有暴露提供更改值機制的其他內(nèi)部方法,[[Writable]] 和 [[Configurable]] 之一或全部必須是 true。
  • 如果屬性是描述過的數(shù)據(jù)屬性,并且其 [[Writable]] 和 [[Configurable]] 都是 false。那么所有對 [[GetOwnProperty]] 的呼出,必須返回作為屬性 [[Value]] 特性的SameValue(9.12)。
  • 如果 [[Writable]] 特性可以從 false 更改為 true,那么 [[Configurable]] 特性必須是 true。
  • 當 ECMAScript 代碼監(jiān)測到宿主對象的 [[Extensible]] 內(nèi)部屬性值是 false。那么如果調(diào)用 [[GetOwnProperty]] 描述一個屬性是不存在,那么接下來所有調(diào)用這個屬性必須也描述為不存在。


如果 ECMAScript 代碼監(jiān)測到宿主對象的 [[Extensible]] 內(nèi)部屬性是 false,那么這個宿主對象的 [[DefineOwnProperty]] 內(nèi)部方法不允許向宿主對象添加新屬性。


如果 ECMAScript 代碼監(jiān)測到宿主對象的 [[Extensible]] 內(nèi)部屬性是 false,那么它以后必須不能再改為 true。


表9——只在某些對象中定義的內(nèi)部屬性O(shè)bject
內(nèi)部屬性取值范圍說明
[[PrimitiveValue]]primitive與此對象的內(nèi)部狀態(tài)信息關(guān)聯(lián)。對于標準內(nèi)置對象只能用 Boolean, Date, Number, String 對象實現(xiàn) [[PrimitiveValue]]。
[[Construct]]SpecOp(a List of any) → Object通過 new 運算符調(diào),創(chuàng)建對象。SpecOp 的參數(shù)是通過 new 運算符傳的參數(shù)。實現(xiàn)了這個內(nèi)部方法的對象叫做 構(gòu)造器 。
[[Call]]SpecOp(any, a List of any) → any or Reference運行與此對象關(guān)聯(lián)的代碼。通過函數(shù)調(diào)用表達式調(diào)用。SpecOp 的參數(shù)是一個 this 對象和函數(shù)調(diào)用表達式傳來的參數(shù)組成的列表。實現(xiàn)了這個內(nèi)部方法的對象是 可調(diào)用 的。只有作為宿主對象的可調(diào)用對象才可能返回 引用 值。
[[HasInstance]]SpecOp(any) → Boolean返回一個表示參數(shù)對象是否可能是由本對象構(gòu)建的布爾值。在標準內(nèi)置 ECMAScript 對象中只有 Function 對象實現(xiàn) [[HasInstance]]。
[[Scope]]Lexical Environment一個定義了函數(shù)對象執(zhí)行的環(huán)境的詞法環(huán)境。在標準內(nèi)置 ECMAScript 對象中只有 Function 對象實現(xiàn) [[Scope]]。
[[FormalParameters]]List of Strings一個包含 Function 的 FormalParameterList 的標識符字符串的可能是空的列表。在標準內(nèi)置 ECMAScript 對象中只有 Function 對象實現(xiàn) [[FormalParameterList]]。
[[Code]]ECMAScript code函數(shù)的 ECMAScript 代碼。在標準內(nèi)置 ECMAScript 對象中只有 Function 對象實現(xiàn) [[Code]]。
[[TargetFunction]]Object使用標準內(nèi)置的 Function.prototype.bind 方法創(chuàng)建的函數(shù)對象的目標函數(shù)。只有使用 Function.prototype.bind 創(chuàng)建的 ECMAScript 對象才有 [[TargetFunction]] 內(nèi)部屬性。
[[BoundThis]]any使用標準內(nèi)置的 Function.prototype.bind 方法創(chuàng)建的函數(shù)對象的預綁定的 this 值。只有使用 Function.prototype.bind 創(chuàng)建的 ECMAScript 對象才有 [[BoundThis]] 內(nèi)部屬性。
[[BoundArguments]]List of any使用標準內(nèi)置的 Function.prototype.bind 方法創(chuàng)建的函數(shù)對象的預綁定的參數(shù)值。只有使用 Function.prototype.bind 創(chuàng)建的 ECMAScript 對象才有 [[BoundArguments]] 內(nèi)部屬性。
[[Match]]SpecOp(String, index) → MatchResult測試正則匹配并返回一個 MatchResult 值(見 15.10.2.1)。在標準內(nèi)置 ECMAScript 對象中只有 RegExp 對象實現(xiàn) [[Match]]。
[[ParameterMap]]提供參數(shù)對象的屬性和函數(shù)關(guān)聯(lián)的形式參數(shù)之間的映射。只有參數(shù)對象才有 [[ParameterMap]] 內(nèi)部屬性。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號