js對象的屬性有很多種斥赋,總結(jié)這一篇文章是為將來理解對象復(fù)制和對象繼承打基礎(chǔ)如失。
數(shù)據(jù)描述符
1. 可枚舉性(Enumerable)
實際上對象的每一個屬性都有一個標志位故响,表示這個屬性是否可以枚舉叔磷。我們通過obj.a=123
這種方式設(shè)置的屬性都為可枚舉屬性须床。有時候我們需要將屬性設(shè)置為不可枚舉,因為我們不希望這個屬性在迭代的時候被訪問(for...in
或 Object.keys
方法)噪叙。
原生對象中幾乎所有屬性都是不可枚舉的矮锈。
你可以通過obj.propertyIsEnumerable(prop)來判斷自身屬性是否可枚舉。
2. 可配置性(configurable)
當且僅當該屬性的 configurable 為 true 時构眯,該屬性描述符
才能夠被改變愕难,也能夠被刪除早龟。我們通過obj.a=123
這種方式設(shè)置的屬性都為可配置屬性惫霸。
3. 可寫性(writable)
當且僅當該屬性的 writable 為 true 時,該屬性才能被
賦值運算符改變葱弟。我們通過obj.a=123
這種方式設(shè)置的屬性都為可寫屬性壹店。
存取描述符
get方法
一個給屬性提供 getter 的方法,它決定了你訪問這個屬性的時候會發(fā)生什么芝加。
set方法
一個給屬性提供 setter 的方法硅卢,它決定了你給這個屬性賦值的時候會發(fā)生什么。
數(shù)據(jù)描述符和存取描述符可以通過Object.defineProperty(obj, prop, descriptor)來設(shè)置或修改藏杖。有關(guān)如何使用它們将塑,也可以在這個方法的描述中看到。
是否是對象自身的屬性
對于一個對象來說蝌麸,它的某個屬性要么屬于對象自身点寥,要么是在原型鏈上。
有關(guān)原型鏈的內(nèi)容来吩,可以看我的另一篇文章徹底理解js的原型鏈敢辩。
相關(guān)方法
判斷方法:
- obj.propertyIsEnumerable(prop) 返回該屬性是否可以枚舉,如果不是自身的屬性弟疆,直接返回false戚长。
- obj.hasOwnProperty(prop):參數(shù)為屬性名,返回布爾值怠苔,這個屬性是否屬于對象自身同廉。只要在對象自身上,不管可不可枚舉都返回true。
- in 操作符:用法
prop in objectName
恤溶,返回這個屬性是否存在于對象自身或原型鏈上乓诽,只要存在,不管可不可枚舉都返回true咒程。注意如果屬性名是字符串鸠天,要用引號括起來。
獲取方法:
- Object.getOwnPropertyDescriptor
- Object.getOwnPropertyNames(obj):返回obj的所有自身屬性的屬性名(包括可枚舉和不可枚舉的屬性)組成的數(shù)組帐姻。
- Object.keys(obj):返回obj的所有可枚舉的自身屬性的屬性名組成的數(shù)組稠集。
- for (variable in object) {...}:迭代一個對象的所有可枚舉屬性,包括在原型鏈上的可枚舉屬性饥瓷。
表格:
可枚舉性與自身屬性的相關(guān)方法
參考資料
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
- http://javascript.ruanyifeng.com/stdlib/attributes.html
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties