JS中萬物都是對象,今天就深度講壹下Object的裏面到底有什麽。文章主要講對象的自有屬性和原型中的屬性,至於原型鏈就不在這篇文章多講了。
創建對象的方法有如下幾種
Object.assign() 方法用於將其他對象的可枚舉屬性復制到目標對象(即第壹個參數對象)
常用於將某個對象合並到新對象{}。
常用於繼承某個構造函數的原型屬性,但是不能繼承該構造函數的實例屬性,例如上面例子
該屬性是實現vue雙向數據綁定的核心,這裏主要講它的使用方法。
講它的相關用法時,就得先理解 的概念。
1.數據屬性
數據屬性的四個特性
configurable: 表示是否能被delete刪除屬性且能重新定義該屬性。
enumerable: 表示能否通過for-in遍歷的屬性。
writable: 表示是否能修改屬性。
value: 屬性的值。
2.訪問器屬性
數據屬性不包含數據值,包含壹對get和set的核心方法,在讀取訪問器屬性時,就是通過這兩個方法進行操作處理的。
訪問器屬性的四個特性
configurable: 表示是否能被delete刪除屬性且能重新定義該屬性。
enumerable: 表示能否通過for-in遍歷的屬性。
get: 讀取屬性時調用的方法,默認值是undefined。
set: 寫入屬性時調用的方法,默認值是undefined。
從圖中可以看到訪問器屬性的configurable和enumerable兩個屬性的默認值都是false,如果後面要對該訪問器屬性進行delete刪除時,將configurable轉化成true即可。
從圖可以看出該對象具有四個屬性,
(defineProperty、defineProperties、getOwnPropertyDescriptor、getOwnPropertyDescriptors)
這四個屬性是分為兩對:defineProperty vs getOwnPropertyDescriptor、defineProperties vs getOwnPropertyDescriptors。
意思為屬性設置和屬性的獲取解析,第壹對上面講過了,這裏就大概說壹下第二對的意思,也就是支持設置對個屬性,獲取多個屬性的意思。
Object.defineProperties()
Object.getOwnPropertyDescriptors()
打印出對象的所有屬性
Object.entries() 方法返回壹個給定對象
Object轉Map
new Map()構造函數接受壹個二維數組,而Object.entries()方法生成壹個二維數組,所以對象、數組、字數串轉化為Map結構變得簡單。
正常對象的數據屬性都可以被 但是通過以下方法,改變了數據屬性的四大特性。
相對應的檢測方法,返回Boolean。
舉例
Object.freeze()方法可凍結對象,凍結後,對象屬性不能刪除,修改以及添加,只能for...in讀取。
該對象方法和==與===運算符相似,但是有明顯區別。
Object.is與==比較
== 會將兩邊的操作數進行隱式轉化,之後再進行比較,但是Object.is就不會進行轉化。
Object.is與===比較
=== NaN和NaN不等,-0與+0相等,但是Object.is就認為NaN和NaN是相等,而-0和+0是不相等的。
所以總的來說這兩個的相似程度比== 運算符更相近。
Object.keys()返回壹個 名稱(鍵)的數組
Object.values()返回可枚舉屬性值得數組
Object.setPrototypeOf(obj, prototype)
為對象obj設置新的原型對象。
註意
如果對象的[[Prototype]]被修改成不可擴展(通過 Object.isExtensible() 查看),就會拋出 TypeError 異常。如果 prototype 參數不是壹個對象或者 null (例如,數字,字符串,boolean,或者 undefined ),則什麽都不做。否則,該方法將 obj 的 [[Prototype]] 修改為新的值。
下篇文章 JS 對象(Object)的深入解析—原型屬性