天天看點

Js對象的内部屬性

<col>

資料屬性

通路器屬性

共同特性

[[enumerable]]

[[configurable]]

特有特性

[[writable]]

[[get]]

[[value]]

[[set]]

設定單個屬性方法

Object.defineProperty(obj, prop, descriptor)

設定多個屬性方法

Object.defineProperties(obj, props)

讀取單個屬性描述符

Object.getOwnPropertyDescriptor(obj, prop)

讀取對象所有屬性描述符

Object.getOwnPropertyDescriptors(obj)

備注

obj: 需要被操作的目标對象;

prop: 目标對象需要定義(讀取)或修改的屬性的名稱;

descriptor: 将被定義或修改的屬性的描述符;

props: 該對象的一個或多個鍵值對定義了将要為對象添加或修改的屬性的具體配置;

[[Configurable]]:

表示能否通過delete删除屬性進而重新定義屬性,(設定為false,表示不能從對象中删除屬性(在嚴格模式下調用delete會報錯)),能否修改屬性的特性,能否把資料屬性修改為通路器屬性(或相反),從true修改為false是單向的,即一旦把把屬性定義為不可配置的,就不能再把它變回可配置了(此時隻能單向修改writable從true到false)。

[[Enumerable]]: 表示能否通過for-in循環傳回屬性

[[Writable]]: 表示能否修改屬性的值

[[Value]] : 包含這個屬性的資料值

[[Get]]: 讀取屬性時調用的函數,預設值為undefined

[[Set]]: 寫入屬性時調用的函數,預設值為undefined

對象常用的内部屬性  

[[Prototype]]——對象的原型(将在下面詳細介紹)

[[Class]]——字元串對象的一種表示(例如,Object Array ,Function Object,Function等);用來區分對象

可以用Object.prototype.toString()方法可以間接得到内部屬性[[Class]]的值,該方法應該傳回下列字元串: "[object " + [[Class]] + "]" 。 比如

[[Get]]——獲得屬性值的方法

[[Put]]——設定屬性值的方法

[[CanPut]]——檢查屬性是否可寫

[[HasProperty]]——檢查對象是否已經擁有該屬性

[[Delete]]——從對象删除該屬性

[[DefaultValue]]傳回對象對于的原始值(調用valueOf方法,某些對象可能會抛出TypeError異常)。

prototype 屬性可以為對象添加方法;

擁有 construct 屬性的對象可以通過 new 操作符來調用,此時該對象可以被了解為類;

擁有call 屬性的對象可以通過函數名稱來調用,JavaScript中一切皆對象,所有的函數(對象)都擁有此屬性。

2.對象的建立、通路和釋放

(1)建立對象

在JavaScript中,使用 new 關鍵字調用構造函數來建立對象。

var 對象名 = new  構造函數();

(2)對象的屬性

對象的屬性都通過 “.”運算符通路。

如果通路值是 null對象的屬性,将出現空引用錯誤。與普通變量函數相同,對象的屬性可以動态生成。将某個屬性值設定為null表示删除該屬性。

在函數内部的對象,函數執行完畢後将自動釋放所占用的資源;

在函數外部定義的對象,将其值設定為null後,垃圾收集器将釋放其占用的資源。

3.常用内置對象

常用的内置對象包括Global,Object,Function,Array,String,Date,RegExp,Math,Error等等。

(1)Global對象: js中頂級對象,一切聲明的變量和函數都是它的屬性。

特性:

1. 沒有 construct 屬性,是以無法使用 new 操作符構造。

2. 沒有 call 屬性,是以無法調用

3. 隻是表示全局對象的概念,依據宿主不同而不同,例如,在浏覽器中,window對象即為Global對象。

(2)Object對象:所有對象的基礎,其他所有對象都從Object 對象擴充而來,這一切都通過原型實作。原型是對象的一個屬性,即 prototype。prototype 本身是一個對象,每個對象都具有此屬性。js中每個對象本身都不包含具體的屬性(但可以動态添加),而是通過原型進行屬性的共享。當擷取一個對象的屬性時,系統首先檢測對象是否直接包含該屬性,如果不包含則從原型屬性中查找;如果扔為找到則傳回 undefined。

所有對象都派生自 Object,是以使用原型為 Object對象擴充屬性時,所有對象都具有該屬性。

(3)Function 對象: 函數也是對象(js中一切皆對象),是以當使用function關鍵字定義函數時,實際上是在系統内部建立了一個Function對象。

具體使用參見:JavaScript 基礎回顧——函數

(4)Error對象: 内置的Error對象可以在發生錯誤時作為參數傳遞給catch子句,也可以使用 new 關鍵字構造自定義的Error對象。

繼續閱讀