關於JavaScript對象的理解


對象

理解對象

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(+00))   //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 = {
    code200,
    title'前端自學社區',
}

Object.defineProperty(obj,"code",{
    writablefalse  //禁止修改對象屬性 code
})

obj.code = 201


console.log(obj)  // 返回{ code: 200, title: '前端自學社區' }

訪問器屬性

它 包含 一個 setter 函數 和 getter 函數,用來返回屬性值和修改屬性的值.

當屬性被修改時,獲取調用setter 函數。

當屬性要獲取值時,會調用getter 函數。

「實際開發中,這個兩個屬性不是必須的,看本身業務需求」

若是一個屬性的值變化,影響到另外一個屬性的值的時候,就可使用 settter  getter 來實現。

let obj = {
    code200,
    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 = {
    code200,
    title'前端自學社區',
}

const des = Object.getOwnPropertyDescriptor(obj,'code')
console.log(des) 
//{ value: 200, writable: true, enumerable: true, configurable: true }
console.log(des.writable) //true



React Hook | 必 學 的 9 個 鉤子

Vue權限路由思考

Vue 組件通訊的 8 種方式

MYSQL經常使用操做指令

TypeScript學習指南(有PDF小書+思惟導圖)




本文分享自微信公衆號 - 前端自學社區(gh_ce69e7dba7b5)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索