defineProperty()
方法的语法为:
Object.defineProperty(obj, prop, descriptor)
使用Object
类名称调用作为静态方法的defineProperty()
方法。
defineProperty()参数
defineProperty()
方法采用:
- obj-在其上定义属性的对象。
- prop-要定义或修改的属性的名称或
Symbol
。 - 描述符 -定义或修改的属性的描述符。
对象中存在的属性描述符有两种类型:数据描述符和访问器描述符。它们可以具有以下可选属性。
-
configurable
-
enumerable
数据描述符也可以具有:
-
value
-
writable
访问器描述符也可以具有:
-
get
-
set
从defineProperty()返回值
- 返回传递给函数的对象。
注意:
- 默认情况下,使用
Object.defineProperty()
添加的值是不可变的且不可枚举。 - 如果描述符不具有
value
,writable
,get
和set
键,则将其视为数据描述符。如果描述符同时具有value
或writable
以及get
或set
键,则将引发异常。
示例:向对象添加数据属性
let obj = {};
// with a data property descriptor
Object.defineProperty(obj, "property1", {
value: 788,
writable: true,
enumerable: true,
configurable: true,
});
console.log(obj.property1); // 788
// with an accessor property descriptor
Object.defineProperty(obj, "property2", {
get() {
console.log("Getting Value...");
return val;
},
set(newVal) {
console.log("Setting Value...");
val = newVal;
},
enumerable: true,
configurable: true,
});
obj.property2 = 6969; // Setting Value...
console.log(obj.property2); // 6969
输出
788
Setting Value...
Getting Value...
6969
我们不能混合使用数据描述符和访问器属性描述符,因为它会引发错误。
要修改属性,对象的writable
属性必须为true
,否则它不会在严格模式下修改并引发错误。
enumerable
属性属性定义该属性是由Object.assign()
还是散布运算符的。
可configurable
属性同时控制是否可以从对象中删除属性以及是否可以更改其属性( value
和writable
除外)。
推荐阅读: Javascript对象defineProperties()