前言
ECMA將對(duì)象定義為:無(wú)序?qū)傩缘募?,其屬性可以包括基本值,?duì)象或者函數(shù)。每個(gè)對(duì)象都是基于一個(gè)引用類型創(chuàng)建的。
理解對(duì)象
- Object.defineProperty()
ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問(wèn)器屬性。通過(guò)Object.defineProperty()可以修改屬性的默認(rèn)特征。
/**
* 數(shù)據(jù)屬性
* configurable: 是否可以修改屬性,刪除屬性。默認(rèn)為true
* enumerable: 是否可以通過(guò)for-in循環(huán)返回此屬性。默認(rèn)為true
* writable: 是否可寫(xiě), 默認(rèn)為true
* value: 默認(rèn)值,默認(rèn)為undefined
* 在調(diào)用Object.defineProperty()方法時(shí),如果不指定, configurable, enumerable, writable特性的默認(rèn)值都是false
*
*/
var animal = {
age: 2
}
Object.defineProperty(animal, 'name', {
value: 'pig'
})
console.log(Object.getOwnPropertyDescriptor(animal, 'name')) // Object {value: "pig", writable: false, enumerable: false, configurable: false}
animal.name = 'bird'
console.log(animal.name) // 無(wú)法修改,結(jié)果還是pig
delete animal.name
console.log(animal.name) // 無(wú)法刪除,結(jié)果還是pig
// 結(jié)果為: age : 2(name并沒(méi)有循環(huán))
for(let key in animal) {
console.log(key, ':', animal[key])
}
//Uncaught TypeError: Cannot redefine property: name(configurable定義為false,則不可在定義為true)
Object.defineProperty(animal, 'name', {
value: '123'
})
/**
* 訪問(wèn)器屬性
* get 訪問(wèn)屬性的值
* set 設(shè)置屬性的值
* 只有g(shù)et沒(méi)有set,只讀
* 只有set沒(méi)有g(shù)et, 只寫(xiě)
* 只有g(shù)et,set,configurable,enumerable屬性,沒(méi)有value和writable屬性
*/
var loan = {id: '0'}
Object.defineProperty(loan, 'id', {
get: function () {
return id
},
set: function (newVal) {
id = newVal
},
configurable: true,
enumerable: true
})
loan.id = '10';
console.log(loan.id) // 0010
- Object.defineProperties()
利用這個(gè)方法可以一次定義多個(gè)屬性
/**
* defineProperties 定義多個(gè)屬性
* 第一個(gè)參數(shù)是對(duì)象
* 后一個(gè)參數(shù)也是對(duì)象。對(duì)象中包含需要設(shè)置的屬性
*/
var user = {}
Object.defineProperties(user, {
name: {
value: '日暮途遠(yuǎn)'
},
password: {
get: function () {
return this.passowrd
},
set: function (newValue) {
this.passowrd = newValue
}
},
age: {
value: 18,
writable: false
}
})
//結(jié)果:
// Object {name: "日暮途遠(yuǎn)", age: 18}
// age
// :
// 18
// name
// :
// "日暮途遠(yuǎn)"
// password
// :
// (...)
// get password
// :
// function ()
// set password
// :
// function (newValue)
// __proto__
// :
// Object
console.log(user)
- Object.getOwnPropertyDescriptor()
通過(guò)Object.getOwnPropertyDescriptor()方法可以獲得給定屬性的描述符。
/**
* getOwnPropertyDescriptor 獲取屬性的特性
* 第一個(gè)參數(shù)是對(duì)象
* 第二個(gè)參數(shù)是屬性名稱
*/
// 訪問(wèn)器類型
console.log(Object.getOwnPropertyDescriptor(user, 'password')) // Object {enumerable: false, configurable: false, get: function, set: function}
// 數(shù)據(jù)類型
console.log(Object.getOwnPropertyDescriptor(user, 'age')) // Object {value: 18, writable: false, enumerable: false, configurable: false}
引用
- javascript高級(jí)程序設(shè)計(jì)
- MDN