無序屬性的集合(散列表),其屬性能夠包含基本值,對象或函數;瀏覽器
每一個對象都是基於一個引用類型建立的,這個引用類型能夠是原生類型,也能夠是自定義類型。函數
建立一個Object實例ui
var person = new Object()
person.name = 'Memory'
person.age = 24
person.sayName = function () {
console.log(this.name) // Memory
}
複製代碼
對象字面量this
var person = {
name: 'Memory',
age: 24,
sayName: function () {
console.log(this.name) // Memory
}
}
複製代碼
其中name
和age
是person的屬性,sayName
是person的方法。spa
只有內部才用的特性,在JS中不能直接訪問它們,爲了表示特性是內部值,把它們放到了[[]]中;設計
ECMAScript中有如下兩種屬性,數據屬性和訪問器屬性。code
其中,person.name的[Configurable]]、[[Enumerable]]、[[Writable]]都爲true,[[Value]]爲Memory。cdn
修改數據屬性:Object.defineProperty(對象obj
, [屬性名稱]
, 描述符對象
)對象
其中,描述符對象的屬性必須是configurable、enumerable、writable、value以內的一到四個。blog
在調用Object.defineProperty時,若是不指定,configurable、enumerable、writable的值都默認爲false
;
在把configurable設爲false以前,能夠屢次調用Object.defineProperty()修改同一個屬性。以後修改除writable
以外的其餘特性,都會致使錯誤;
嘗試修改writable:
Object.defineProperty(person, 'name', {
configurable: false,
})
console.log(person.name) // Memory
Object.defineProperty(person, 'name', {
writable: true,
value: 'doublemeng'
})
console.log(person.name) // doublemeng
複製代碼
嘗試修改configurable:
Object.defineProperty(person, 'name', {
configurable: false,
})
console.log(person.name) // Memory
// Uncaught TypeError: Cannot redefine property: name
Object.defineProperty(person, 'name', {
configurable: true,
value: 'doublemeng'
})
console.log(person.name)
複製代碼
configurable設爲false,即表示不能從對象中刪除屬性;
若是這個對象調用delete,非嚴格模式下會被忽略,嚴格模式下則會拋錯。
writable設爲false,即表示該屬性不可寫;
非嚴格模式下會被忽略,嚴格模式下則會拋錯。
訪問器屬性包含getter和setter函數(這兩個函數都不是必需的),其中setter用來寫值,getter用來讀值。
設置一個屬性的值會致使其餘屬性的變化,以下例year
的變化致使_year
和age
的變化:
var book = {
age: 1,
_year: 2000 // 只能經過對象方法訪問的屬性
}
console.log(book._year) // 2000
console.log(book.age) // 1
Object.defineProperty(book, 'year', {
get: function () {
return this._year
},
set: function (newYear) {
this._year = newYear
this.age = newYear - 2000 + 1
}
})
book.year = 2019
console.log(book._year) // 2019
console.log(book.age) // 20
複製代碼
不必定非要指定getter和setter;
只指定getter意味着屬性只能讀不能寫;
嘗試寫入,在非嚴格模式下會被忽略,嚴格模式下則會拋錯。
只指定setter意味着屬性只能讀不能讀;
嘗試讀取,在非嚴格模式下會返回undefined,嚴格模式下則會拋錯。
在該方法以前,要建立訪問器屬性通常要使用兩個非標準的方法:__defineGetter__()
和 __defineSetter__()
var book = {
age: 1,
_year: 2000 // 只能經過對象方法訪問的屬性
}
console.log(book._year) // 2000
console.log(book.age) // 1
book.__defineGetter__('year', function () {
return this._year
})
book.__defineSetter__('year', function (newYear) {
this._year = newYear
this.age = newYear - 2000 + 1
})
book.year = 2019
console.log(book._year) // 2019
console.log(book.age) // 20
複製代碼
不支持Object.defineProperty()
的瀏覽器不能修改[Configurable]]
和[[Enumerable]]
Object.defineProperties(對象obj
,對象 其屬性爲obj要添加和修改的屬性
)
Object.getOwnPropertyDescriptor(對象
,屬性
)
《JavaScript高級程序設計》
本文主要介紹了對象屬性的各類特性。其主要包括數據屬性的[[Configurable]]
、[[Enumerable]]
、[[Writable]]
、[[Value]]
和訪問器屬性的[[Configurable]]
、[[Enumerable]]
、[[Get]]
、[[Set]]
。
若有問題,歡迎指正。