javascript中对象的属性配置

数据属性描述符

value：值

writable：值是否可改写

enumerable：是否可枚举（forin，Object.keys()）

configurable：是否可配置（delete，defineProperty 是否可以设置成功）

note
属性描述符在单个属性的级别上工作。

Object.getOwnPropertyDescriptor

获取数据属性的描述符。

Copy
const user = {
name: 'z',
age: 23
}

const config = Object.getOwnPropertyDescriptor(user, 'name')

console.log(config)
// { value: 'z', writable: true, enumerable: true, configurable: true }

Object.defineProperty

设置数据属性的描述符。

Copy
const user = {
name: 'z',
age: 23
}

Object.defineProperty(user, 'name', {
writable: false,
enumerable: false,
configurable: false
})

Object.defineProperties

一次性设置对象多个数据属性的描述符。

Copy
const user = {
name: 'z',
age: 23
}

Object.defineProperties(user, {
name: {
writable: false,
enumerable: false,
configurable: false
},
age:{
writable: false,
enumerable: false,
configurable: false
}
})

Object.getOwnPropertyDescriptors

一次性获取所有数据属性描述符。

Copy
const user = {
name: 'z',
age: 23
}

const config = Object.getOwnPropertyDescriptors(user)
console.log(config)
// {
// name: { value: 'z', writable: true, enumerable: true, configurable: true },
// age: { value: 23, writable: true, enumerable: true, configurable: true }
//}

设定一个全局的密封对象

Object.seal(obj)

禁止添加 / 删除属性。为所有现有的属性设置 configurable: false。

Object.freeze(obj)

禁止添加 / 删除 / 更改属性。为所有现有的属性设置 configurable: false, writable: false。

访问器属性

本质上是用于获取和设置值的函数，但从外部代码来看就像常规属性。

Copy
let obj = {
get propName() {
// 当读取 obj.propName 时，getter 起作用
},

set propName(value) {
// 当执行 obj.propName = value 操作时，setter 起作用
}
};

getter 和 setter

访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中，它们用 get 和 set 表示：

Copy
let user = {
name: "John",
surname: "Smith",

get fullName() {
return `${this.name} ${this.surname}`;
},

set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};

// set fullName 将以给定值执行
user.fullName = "Alice Cooper";

console.log(user.fullName) // Alice Cooper
console.log(user.name); // Alice
console.log(user.surname); // Cooper

访问器描述符

get： 一个没有参数的函数，在读取属性时工作

set： 一个带有单个参数的函数，当写入属性时工作

enumerable：与数据属性的相同，

configurable： 与数据属性的相同，

Copy
let user = {
name: "John",
surname: "Smith"
};

Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
enumerable: true,
set(value) {
[this.name, this.surname] = value.split(" ");
}
});

console.log(user.fullName); // John Smith

for(let key in user) console.log(key); // name, surname, fullName