W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本規(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ù)列表后跟著“→”符號和返回值的類型。
內(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) → primitive | Hint 是一個字符串。返回對象的默認值 |
[[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)部方法必須符合宿主對象每個屬性的以下不變量 :
如果 ECMAScript 代碼監(jiān)測到宿主對象的 [[Extensible]] 內(nèi)部屬性是 false,那么這個宿主對象的 [[DefineOwnProperty]] 內(nèi)部方法不允許向宿主對象添加新屬性。
如果 ECMAScript 代碼監(jiān)測到宿主對象的 [[Extensible]] 內(nèi)部屬性是 false,那么它以后必須不能再改為 true。
內(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)部屬性。 |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: