Object.defineProperty() 的属性和用法
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
1、用法:
Object.defineProperty(obj, prop, descriptor)
obj
:要在其上定义属性的对象。
prop
:要定义或修改的属性的名称。
descriptor
:将被定义或修改的属性描述符。
2、defineProperty 的属性:
如果对象中不存在指定的属性,Object.defineProperty()
就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false
。value
,get
和set
字段的默认值为undefined
。
2.1、Configurable 特性
configurable
特性表示对象的属性是否可以被删除,以及除writable
特性外的其他特性是否可以被修改。
var obj = {};
obj.a = 1;
// 等同于 :
Object.defineProperty(obj, "a", {
value : 1,
writable : true,
configurable : false, // false , defineProperty的其他属性不能被修改
enumerable : true
});
Object.defineProperty(obj, 'a', {
enumerable: false
});
// 报错 Cannot redefine property: aat Function.defineProperty (<anonymous>)
// 无法重新定义属性:a at function.defineproperty
2.2、Enumerable 特性 (详情请点击 defineProperty的可枚举属性的定义,可枚举属性的设置以及可枚举属性的用处)
enumerable
定义了对象的属性是否可以在 for...in
循环和 Object.keys()
中被枚举。
2.3、Writable 属性
当writable
属性设置为false
时,该属性被称为“不可写”。它不能被重新分配。
// strict mode
(function() {
'use strict';
var o = {};
Object.defineProperty(o, 'b', {
value: 2,
writable: false
});
o.b = 3;
// throws TypeError: Cannot assign to read only property 'b' of object '#<Object>'
// 无法为对象“<object>的只读属性“b”赋值
return o.b; // returns 2 without the line above
}());
2.4、参看MDN文档:Object.defineProperty() 详细介绍