前言
ECMA將對象定義為:無序?qū)傩缘募希鋵傩钥梢园ɑ局低烀梗瑢ο蠡蛘吆瘮?shù)移盆。每個對象都是基于一個引用類型創(chuàng)建的。
理解對象
- Object.defineProperty()
ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性轨域。通過Object.defineProperty()可以修改屬性的默認(rèn)特征袱耽。
/**
* 數(shù)據(jù)屬性
* configurable: 是否可以修改屬性,刪除屬性干发。默認(rèn)為true
* enumerable: 是否可以通過for-in循環(huán)返回此屬性朱巨。默認(rèn)為true
* writable: 是否可寫, 默認(rèn)為true
* value: 默認(rèn)值,默認(rèn)為undefined
* 在調(diào)用Object.defineProperty()方法時枉长,如果不指定冀续, 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) // 無法修改沥阳,結(jié)果還是pig
delete animal.name
console.log(animal.name) // 無法刪除,結(jié)果還是pig
// 結(jié)果為: age : 2(name并沒有循環(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'
})
/**
* 訪問器屬性
* get 訪問屬性的值
* set 設(shè)置屬性的值
* 只有g(shù)et沒有set,只讀
* 只有set沒有g(shù)et, 只寫
* 只有g(shù)et,set,configurable,enumerable屬性桐罕,沒有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()
利用這個方法可以一次定義多個屬性
/**
* defineProperties 定義多個屬性
* 第一個參數(shù)是對象
* 后一個參數(shù)也是對象脉让。對象中包含需要設(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()
通過Object.getOwnPropertyDescriptor()方法可以獲得給定屬性的描述符。
/**
* getOwnPropertyDescriptor 獲取屬性的特性
* 第一個參數(shù)是對象
* 第二個參數(shù)是屬性名稱
*/
// 訪問器類型
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高級程序設(shè)計
- MDN