本文最后更新于:2024年4月25日 上午
创建对象
创建实例方式
1 2 3 4 5 6 7
| const person = new Object()
person.name = '清山' person.age = 20 person.say = function say() { console.log('你好!') }
|
字面量方式
👍推荐的创建方式
1 2 3 4 5 6 7
| const person = { name: '清山', age: 20, say() { console.log('你好!') } }
|
属性配置
属性特性
使用字面量方式或新实例的方式无法直接配置对象属性的特性, 使用Object
对象的defineProperty
方法可以配置对象属性的特性.该方法会返回对象本身
1 2 3 4 5 6
| Object.defineProperty(person, 'name', { value: 'Jonathan', writable: false, enumerable: false, configurable: false })
|
value
: 属性值,不可写可编辑特性时可编辑特性来修改值
writable
: 属性值可写性
enumerable
: 属性是否参与迭代器
configurable
: 属性特性是否可编辑,是否可delete
访问器属性
通过defineProperty
方法还可以为对象声明访问器属性(vue2
响应式核心),使用访问器属性可以在属性值被读取/修改时执行一些其他操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const person = Object.defineProperty({}, '_name', { value: 'Jonathan', writable: false, configurable: true, })
Object.defineProperty(person, 'name', { set(value) { Object.defineProperty(person, '_name', { value, }) console.log(`已修改名称为${value}`) },
get() { return `我的名称为${this._name}` },
configurable: true, enumerable: true, })
|
使用Object的defineProperties
方法可以同时声明多个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const person = Object.defineProperties( {}, { _name: { value: 'Jonathan', writable: false, configurable: true, },
name: { set(value) { Object.defineProperty(person, '_name', { value, }) console.log(`已修改名称为${value}`) },
get() { return `我的名称为${this._name}` }, }, } )
|
也可用字面量方式声明访问器属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const person = { _name: '', set name(value) { Object.defineProperty(person, '_name', { value, }) console.log(`已修改名称为${value}`) },
get name() { return `我的名称为${this._name}` }, }
Object.defineProperty(person, '_name', { value: 'Jonathan', writable: false, configurable: true, })
|
读取属性特性
Object提供两个方法来查询属性的特性
getOwnPropertyDescriptor()
查看单个属性
getOwnPropertyDescriptors()
查看各个属性的特性不会获取深层属性特性
1 2
| Object.getOwnPropertyDescriptor(person, 'name') Object.getOwnPropertyDescriptors(person)
|
对象拷贝
浅拷贝
使用解构或Object.asign({}, src)
均可快速的浅拷贝js对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const src = { name: '清山', age: 18, other: { gender: 'male', address: 'China', }, }
const src2 = { ...src, }
src2.other.address = 'Zhejiang Province'
|