對象的屬性
1.原型屬性:
原型屬性是用來繼承原型對象的屬性的。ES5裏對象的創建有三種方法:
--直接量創建--將Object.prototype作為新對象的原型
--new 構造函數--將構造函數的prototype作為新對象原型
--Object.create(obj)傳入一個原型對象,obj作為原型
ES5中可以通過Object.getPrototypeOf()查詢某對象的原型;在ES3中通過不等價的方法:obj.constructor.prototype屬性。
對於第一種創建對象方法,constructor指代Object()構造函數,因此constructor.prototype才是其原型(所有直接量創建的對象的原型都指向object.prototye)
對於第二種方法,constructor指向其構造函數
對於第三種創建對象方法,constructor指代Object()構造函數,但新對象的原型是傳入的參數!
-----------------
要檢測一個對象是否為另一個對象的原型,用isPrototypeOf()方法:
p.isPrototypeOf(o) --檢測p是否為o的原型
2.class屬性
該屬性是一個字符串,表示對象的類型信息。
只有一種簡潔的方法可以查詢它:繼承自Object.prototye的toString方法,返回:
[object class]
但由於很多對象的toString方法重寫了,為了調用正確版本的toString(),只好間接地調用Function.call()。
Object.prototye.toString.call(obj) 判斷obj屬於哪種類型,比如判斷是否為數組。
3.可擴展性
設置對象是否可擴展,可以固化對象的屬性,即不可添加屬性/方法。
4.特性屬性
剛學JS的都知道對象是一組無序屬性/值,屬性的值可以是原始類型或對象類型,也可以是一個或一組getter、setter。
對象的屬性可以分為存取器屬性(accessor property)和數據屬性(data
property)。除了名值外,屬性還具有一些標識其可寫、可枚舉、可配置的特性。
對於數據屬性,4個特性分別是:值、可寫性、可枚舉性、可配置性。
由getter、setter定義的屬性叫存取器屬性,getter、setter是函數。存取器屬性不具有可寫特性,getter和setter分別對應了其讀寫特性,另外兩個特性是可枚舉性、可配置性。
在ES3中,用戶自定義屬性都是可寫、可枚舉、可配置的,且這些特性不能修改。
ES5定義了一個“屬性描述符”對象,代表屬性的4個特性。其中writable、enumerable、configurable是布爾值。也定義了查詢和設置這些特性的API:
--Object.getOwnpropertyDescriptor(obj,[key]);獲取某對象的某屬性的特性描述符,不存在或繼承的屬性返回undefined
--Object.getPropertyOf() 想獲取繼承屬性的特性,只能遍歷原型鏈
--Object.defineProperty(obj,[key],descriptorObj);設置對象的某屬性的特性,只能修改自由屬性
--Object.defineProperties(obj,keyDescObj)
第二個參數是一個對象形式映射,屬性:描述符。
對象的屬性