📅  最后修改于: 2023-12-03 15:16:06.092000             🧑  作者: Mango
在 JavaScript 中,对象 (Object) 是指拥有属性的数据结构。每个属性都有一个名称 (name 或者 key) 和对应的值 (value),属性可以分为数据属性 (Data property) 和访问器属性 (Accessor property)。
Object.getOwnPropertyDescriptor()
方法可以获取某个对象自身属性的描述符 (包括数据属性和访问器属性),描述符是一个对象,包含以下属性:
value
:该属性所对应的值,默认为 undefined
writable
:如果该属性的值可以被修改,则为 true
;否则为 false
。默认值为 false
enumerable
:如果该属性可以通过 for...in
循环访问到,则为 true
;否则为 false
。默认值为 false
configurable
:如果该属性的描述符可以被更改、该属性可以被删除、以及该属性的值可以被修改,则为 true
;否则为 false
。默认值为 false
get
:访问器属性的 getter 函数。默认值为 undefined
set
:访问器属性的 setter 函数。默认值为 undefined
Object.getOwnPropertyDescriptor(obj, prop)
obj
:目标对象。prop
:要获取的属性名称。如果指定的属性存在于传入的对象上,返回该属性的描述符对象;否则返回 undefined
。
const obj = {
name: 'Tom',
age: 18,
sayHello() {
console.log(`Hello ${this.name}!`);
}
};
const nameDescriptor = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(nameDescriptor);
// 输出:
// {
// value: 'Tom',
// writable: true,
// enumerable: true,
// configurable: true
// }
const ageDescriptor = Object.getOwnPropertyDescriptor(obj, 'age');
console.log(ageDescriptor);
// 输出:
// {
// value: 18,
// writable: true,
// enumerable: true,
// configurable: true
// }
const sayHelloDescriptor = Object.getOwnPropertyDescriptor(obj, 'sayHello');
console.log(sayHelloDescriptor);
// 输出:
// {
// value: [Function: sayHello],
// writable: true,
// enumerable: true,
// configurable: true
// }
const obj = {
_name: 'Jack',
get name() {
return this._name;
},
set name(newName) {
this._name = newName;
}
};
const nameDescriptor = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(nameDescriptor);
// 输出:
// {
// get: [Function: get],
// set: [Function: set],
// enumerable: true,
// configurable: true
// }
Object.getOwnPropertyDescriptor()
方法只能获取对象自身属性的描述符,不能获取继承属性的描述符。Object.defineProperty()
方法可用于修改或添加一个对象的属性,并且可以设置属性描述符。