https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。
const object1 = {};
Object.defineProperty(object1, 'property1', {
value: 42,
writable: false
});
object1.property1 = 77;//在严格模式下引发错误
console.log(object1.property1);// 结果: 42;如果writable: true;则输出77
demo01 - 属性描述符默认值
属性 默认值 说明
configurable false 描述属性是否可以被删除,默认为 false
enumerable false 描述属性是否可以被for...in或Object.keys枚举,默认为 false
writable false 描述属性是否可以修改,默认为 false
get undefined 当访问属性时触发该方法,默认为undefined
set undefined 当属性被修改时触发该方法,默认为undefined
value undefined 属性值,默认为undefined
// demo01-default.html
// Object.defineProperty(对象,属性,属性描述符)
var obj = {};
console.log('obj:', obj);
// 默认不可删除,不可枚举,不可修改
Object.defineProperty(obj, 'name', {
value: 'Jameswain'
});
console.log('obj默认值:', obj);
delete obj.name;
console.log('obj删除后:', obj);
console.log('obj枚举:', Object.keys(obj));
obj.name = '詹姆斯,韦恩';
console.log('obj修改后:', obj);
// 不能重新定义,会报重复定义错误: Uncaught TypeError: Cannot redefine property: name
Object.defineProperty(obj, 'name', {
value: '詹姆斯,韦恩'
});
obj: {}
结果:
VM61:7 obj默认值: {name: "Jameswain"}
VM61:9 obj删除后: {name: "Jameswain"}
VM61:10 obj枚举: []
VM61:12 obj修改后: {name: "Jameswain"}
VM61:14 Uncaught TypeError: Cannot redefine property: name
at Function.defineProperty (<anonymous>)
at <anonymous>:14:10
从运行结果可以发现,使用Object.defineProperty()定义的属性,默认是不可以被修改,不可以被枚举,不可以被删除的。可以与常规的方式定义属性对比一下:如果不使用Object.defineProperty()定义的属性,默认是可以修改、枚举、删除的:
const obj = {};
obj.name = 'Jameswain';
console.log('枚举:', Object.keys(obj));
obj.name = '詹姆斯-韦恩';
console.log('修改:', obj);
delete obj.name;
console.log('删除:', obj);
结果:
枚举: ["name"]
修改: {name: "詹姆斯-韦恩"}
删除: {}
网友评论