创建一个对象
// 两种方式
var o1 = new Object() //利用Object内置对象
var o2 = {} //使用对象字面量的方式
为对象添加属性
数据属性
o1.name = 'phoeny'
o2 = {name: 'phoeny'}
上面两种方式创建的属性都是数据属性,它具有四个特性:
configurable: true(是否可通过delete删除,是否可转换为访问器属性,其特性是否可修改)enumerable: true(是否可通过for-in循环)writable: true(是否可修改属性的值)value: undefined(属性的数据值)
也就是通过普通方式创建的数据属性都有其默认的特性,这些特性也是可以修改的,修改数据属性的特性用:Object.defineProperty()
var o = {}
o.defineProperty(o, 'name', {
writable: false,
value: 'yoyo'
})
// 上一步已经将对象o的name属性定义为不可修改的属性了,所以再尝试去修改它是无效的
o.name = 'jim' // 仍然是 yoyo
使用Object.defineProperty()的注意点:
configurable特性,这个特性一旦设置为false,就不能再设置回true了。- 使用
Object.defineProperty()时,如果不设置configurable,enumerable,writable,它们会默认变为false
访问器属性
访问器属性,也具有四个特性:
configurable: true(是否可通过delete删除,是否可转换为访问器属性,其特性是否可修改)enumerable: true(是否可通过for-in循环)get: undefined(读取属性时调用的函数)set: undefined(写入属性时调用的函数)
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
var o = {_year: 2004 }
Object.defineProperty(o, 'year', {
get: function() {
return this._year;
},
set: function(newValue) {
var y = newValue > 2023 ? 2023 : newValue
this._year = y
},
})
o.year = 2022 // {_year: 2022}
o.year = 2024 // {_year: 2023}
使用访问器属性的注意点:
- 不设置get特性表示属性不能读,不设置set特性表示属性不能写
Object.defineProperty()
Object.defineProperty可以用于:
- 修改数据属性的特性
- 定义访问器属性
同时也提供Object.defineProperties()定义同时定义多个属性。提供Object.getOwnPropertyDescriptor()读取属性的特性。