// ES5中对象属性分为两种,数据属性和访问器属性
// --- 数据属性,直接访问value;
// --- 访问器属性,通过getter和setter来进行读写操作
/*
一 : 数据属性。
有4个特性
1. configurable, 表示是否可以delete,是否可以修改特性,是否可以把属性修改为访问器属性。一旦设置为false之后,不可再次设置! configurable 一旦为false,只可以改变writable的值,其他会抛异常。
2. enumerable, 表示能否通过for - in 返回属性
3. writable,表示能否修改属性的值
4. value,表示这个属性的数据值。
*/
var person = {}
Object.defineProperty(person, 'name', {
configurable: true,
value: '张三'
})
console.log('1', person.name)
Object.defineProperty(person, 'name', {
configurable: false,
value: '李四'
})
console.log('2', person.name)
// configurable设置为false之后,不可再次设置,再次设置则会抛出异常
// Object.defineProperty(person, 'name', {
// configurable: true,
// value: '李四一'
// })
Object.defineProperty(person, 'name', {
writable: false
})
JSON.stringify(Object.getOwnPropertyDescriptor(person, 'name'))
// 因为属性的value也是属于特性,所以fonfigurable为false之后,值也不可以变更了
delete person.name
person.name = '王五'
console.log('3', person.name)
console.log('4', JSON.stringify(Object.getOwnPropertyDescriptor(person, 'name')))
/*
二:访问器属性
有4个特性
1.configurable
2.enumerable
3.get 读取时调用
4.set 写入时调用
*/
var book = {
_year: 2004, // 常用_表示内部变量
version: 1
}
Object.defineProperty(book, "year", {
get: function() {
return this._year
},
set: function (newValue) {
this.version++
this._year = newValue
}
})
console.log(book._year)
book.year = 2005
console.log(book.version, book.year)
Object.defineProperties(book, {
name: {
enumerable: true,
value: '作者'
},
_price: {
writable: true,
configurable: true,
value: 100
},
price: {
enumerable: true,
get: function () {
return this._price
},
set: function(newV) {
this._price = newV
}
}
})
book.price = 200
console.log(JSON.stringify(book), book.name, book.price)
console