ES6中常用的物件方法:Object.keys()、Object.values() ...
1. Object.assign()
Object.assign() 用於將所有可列舉屬性的值從一個或多個源物件,複製到目標物件。
語法:Object.assign(obj, ...sources)
-
-
obj:目標物件
-
sources:源物件,可以是多個
-
返回目標物件
-
複製一個物件
const obj = { a: 1 } const copy = Object.assign({}, obj) console.log(copy); // { a: 1 }
合併物件
const obj1 = { a: 1, b: 2 } const obj2 = { b: 3, c: 4 } const obj3= { c: 5, d: 6 } const obj = Object.assign(obj1, obj2, obj3) console.log(obj) // {a: 1, b: 3, c: 5, d: 6}
注:如果目標物件與源物件有同名屬性,則後面的屬性會覆蓋前面的屬性;如果多個源物件有同名的屬性,則後面的源物件會覆蓋前面的。
物件的深拷貝
通過 Object.assign() 我們可以很快的實現物件的複製,然而這只是一個淺拷貝,因為 Object.assign() 方法拷貝的是可列舉屬性值,如果源物件的屬性值是一個物件的引用,那麼該方法也只會複製其引用。
// 淺拷貝 let o1 = { a:0, b: { c: 0 } } const o2 = Object.assign({}, o1) o1.b.c = 1 console.log(o2.c) // 1
那麼,我們怎麼實現一個物件的深拷貝呢?
如果不考慮保留內建型別,最快速的方法是通過JSON.stringify() 將該物件轉換為 json 字串表現形式,然後再將其解析回物件。
// 深拷貝:方法一 let obj1 = { a: 0 , b: { c: 0}} let obj2 = JSON.parse(JSON.stringify(obj1)) obj1.a = 4 obj1.b.c = 4 console.log(obj1)// { a: 4, b: { c: 4}} console.log(obj2) // { a: 0, b: { c: 0}}
還可以通過遞迴的方法實現深拷貝
// 深拷貝:方法二 const obj = { name: 'andy', age: 18, info: { gender: 'male', schoole: 'NEWS' }, color: ['pink', 'yellow'] } function deepCopy(obj){ let o = {} for(let k in obj) { // 此處的for...in方法可以使用Object.keys(obj).map(k =>{....}) 替換 // 1.獲取屬性值 var item = obj[k]; // 2.判斷屬性值屬於哪種資料型別 if(item instanceof Array) { // 是否是陣列 o[k] = [] deepCopy(o[k], item) } else if(item instanceof Object) { // 是否是物件 o[k] = {} deepCopy(o[k], item) } else { // 簡單資料型別 o[k] = item } } return o } const newObj = deepCopy(obj) console.log(newObj)
此外,還可以通過
2. Object.create()
Object.create() 建立一個新物件
語法:Object.create(proto)
-
proto:新建立物件的原型物件
-
返回一個新物件
使用:
const person = { isHuman: false, printIntroduction: function() { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); } }
const me = Object.create(person) console.log(me) // {} me.name = 'Matthew' // "name" is a property set on "me", but not on "person" me.isHuman = true // inherited properties can be overwritten me.printIntroduction() // My name is Matthew. Am I human? true console.log(me.__proto__ === person) //true
// 通過new Object()方式建立物件 const me = new Object(person) console.log(me) // {isHuman: false, printIntroduction: ƒ} me.name = 'Matthew' me.isHuman = true console.log(me) // {isHuman: true, name: "Matthew", printIntroduction: ƒ}
Object.create() 可以實現物件的繼承,可以通過物件例項的 __proto__屬性訪問原型鏈上的屬性。
new Object() 方法建立的物件,給物件原型新增屬性和方法則需要通過建構函式或者類。
function Person(name, age){ this.name=name this.age=age } Person.prototype.sayHi = function(){ console.log(this.name) }
let p = new Person('jack', 20) console.log(p.sayHi()) // jack console.log(p.__proto__ === Person.prototype) // true
3.Object.defineProperty()
Object.defineProperty() 新增或修改現有屬性,並返回該物件。
語法:Object.defineProperty(obj, prop, description)
-
-
obj:必需。目標物件
-
prop:必需。需定義或修改的屬性的名字
-
descriptor:必需。目標屬性所擁有的特性,以物件形式{}書寫。
-
value:設定屬性的值,預設為 undefined
-
writable:值是否可以重寫,true | false,預設為 false
-
enumerable:目標屬性是否可以被列舉,true | false,預設為 false
-
configurable:目標屬性是否可以被刪除或是否可以再次修改特性,true | false,預設為 false
-
-
const obj = { id: 1, name: 'phone', price: '$599' } Object.defineProperty(obj, 'num', { value: 100, enumerable: false })
console.log(obj) // {id: 1, name: "phone", price: "$599", num: 100} console.log(Object.keys(obj)) // ["id", "name", "price"]
4.Object.entires()
Object.entires() 遍歷並返回該物件可列舉屬性的鍵值對陣列
語法:Object.entires(obj)
-
-
返回物件可列舉屬性的鍵值對陣列
-
const obj = { a: 'apple', b: 'bar' } console.log(Object.entries(obj)) // [ ['a', 'apple'], ['b', 'bar'] ]
for (const [key, value] of Object.entries(obj)) { console.log(`${key}: ${value}`) //"a: somestring" "b: 42" }
Object.entries(obj).forEach(([key, value]) => { console.log(`${key}: ${value}`) // "a: somestring", "b: 42" })
5.Object.keys()
Object.keys() 用於獲取物件自身所有可列舉的屬性
語法:Object.keys(obj)
-
-
效果類似於 for...in
-
返回一個由屬性名組成的陣列
-
const obj = { id: 1, name: 'phone', price: '$599', num: 100 } const objKeys = Object.keys(obj); console.log(objKeys); //['id', 'name', 'price', 'num'] const arr = ['a', 'b', 'c'] const arrKeys = Object.keys(arr) console.log(arrKeys) //['0', '1', '2']
補充:如果只要獲取物件的可列舉屬性,可用Object.keys
或用for...in
迴圈(for...in
迴圈會得到物件自身的和繼承的可列舉屬性,可以使用hasOwnProperty()
方法過濾掉)
6.Object.values()
Object.values() 獲取物件自身所有可列舉的屬性值
語法:Object.values(obj)
-
-
返回一個由屬性值組成的陣列
-
const obj = { id: 1, name: 'phone', price: '$599', num: 100 } const objValues = Object.values(obj); console.log(objValues); //[1, 'phone', '$599', '100']
附:物件的所有屬性和方法