對象
理解對象
ECMA-262把對象定義爲:「無序屬性的集合,其屬性能夠包含基本值、對象或者函數。」嚴格來說,這就至關於說對象是一組沒有特定順序的值。對象的每一個屬性或方法都有一個名字,而每一個名字都映射到一個值。前端
咱們能夠把ECMAScript的對象想象成散列表:無非就是一組名值對,其中的值能夠是數據或函數。web
每一個對象都是基於一個引用類型建立的,即建立自定義對象的最簡單方式就是建立一個Object的實例,而後再爲它添加屬性和方法微信
合併對象
它 是值 把源對象全部屬性 複製到目標對象屬性當中。前端工程師
在
ES6
中提供了Object.assign()
來合併對象。app這個方法接受一個目標對象和一個或多個源對象做爲參數,而後將源對象的全部屬性和自有屬性 複製到目標對象當中。編輯器
「合併對象除了使用
Object.assign
, 還可使用 ... 對象擴展符 來簡化合並對象」函數s學習
注意:
Object.assign()
是淺複製,若是多個源對象之間合併出現,重複屬性時,會取最後一個屬性的值。
// ...
var a = {
title:'初級前端工程師'
}
var b = {
address: '北京中關村'
}
var c = { ...a, ...b}
console.log(c)
// { title: '初級前端工程師', address: '北京中關村' }
//Object.assign()
var job = {
title:'高級前端工程師'
}
var salary = {
wage: '22w'
}
var HaiJun = {}
console.log(Object.assign(HaiJun,a,job,salary))
//{ title: '高級前端工程師', wage: '22w' }
對象標識類型及相等判斷
在
ES6
中提供 了Object.is()
方法,它接受兩個參數。ui
console.log(Object.is(1,"1")) //false
console.log(Object.is({},{})) //false
console.log(Object.is(+0, 0)) //true
var objA = {
id:2
}
var objB = {
id:2
}
console.log(Object.is(objA.id,objB.id)) //true
對象的屬性
ECMA-262
第5版在定義了只有內部才用的特性時,描述了屬性的各類特徵,這些特徵是爲了實現JavaScript引擎用的,所以在JavaScript中不能直接訪問它們。this在
JavaScript
中,對象的屬性類型 爲:數據屬性
和訪問器屬性
.
數據屬性
定義: 數據屬性包含一個數據值的位置,這個位置能夠讀取和寫入值,可經過對象直接定義的屬性。數據屬性有四個描述其行爲的特性。
它有 4 個特定行爲來
約束屬性行爲
。按時
注意:
在調用 Object.defineProperty()
時,若是不指定 屬性的默認行爲的話,它的 3 個行爲 都 爲 false
.「實際開發中,修改屬性默認行爲場景不多,但學習屬性的行爲 有助於 理解對象。」
屬性 | |
---|---|
[[Configurable ]] |
表示是否能夠經過 delete 刪除對象屬性,默認爲 true |
[[ Enumberable ]] |
表示 對象屬性是否 能夠 經過 for-in 來循環。默認爲true |
[[ Writable ]] |
表示 對象屬性的值是否能夠修改,默認爲true |
[[Value ]] |
表示 對象屬性的實際值。 |
如何修改對象屬性默認行爲
經過
Object.defineProperty()
來修改屬性默認行爲參數爲:
目標對象 要修改的對象屬性 一個描述符對象 (這個對象是用來管理屬性默認行爲的)
該方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,並返回此對象。
let obj = {
code: 200,
title: '前端自學社區',
}
Object.defineProperty(obj,"code",{
writable: false //禁止修改對象屬性 code
})
obj.code = 201
console.log(obj) // 返回{ code: 200, title: '前端自學社區' }
訪問器屬性
它 包含 一個
setter
函數 和getter
函數,用來返回屬性值和修改屬性的值.當屬性被修改時,獲取調用
setter
函數。當屬性要獲取值時,會調用
getter
函數。「實際開發中,這個兩個屬性不是必須的,看本身業務需求」
若是一個屬性的值變化,影響到另外一個屬性的值的時候,就可使用
settter
getter
來實現。
let obj = {
code: 200,
title: '前端自學社區',
}
Object.defineProperty(obj,"mounth",{
set(newValue){
if(newValue >3) {
this.code = 400
}
},
get(){
return this.code
}
})
obj.mounth = 4
console.log(obj) //{ code: 400, title: '前端自學社區' }
讀取屬性的行爲
要讀取屬性的特性,必須使用
ECMAScript5
的:Object.getOwnPropertyDescriptor()
來獲取對象屬性的行爲。該函數接受兩個參數:
目標對象 要獲取的屬性 該方法返回指定對象上一個自有屬性對應的屬性描述符。
let obj = {
code: 200,
title: '前端自學社區',
}
const des = Object.getOwnPropertyDescriptor(obj,'code')
console.log(des)
//{ value: 200, writable: true, enumerable: true, configurable: true }
console.log(des.writable) //true
本文分享自微信公衆號 - 前端自學社區(gh_ce69e7dba7b5)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。