在我们创建一个普通对象时,对象的属性都具有隐藏的属性描述符。默认它们都是true。
- var obj = {
- a: 123
- }
在obj对象属性a中包含了以下属性描述符:
writable决定是否可以修改属性的
- var obj = {}
- Object.defineProperty(obj, 'a', {
- value: 123,
- writalbe: false
- })
- obj.a = 234 // 在严格模式下这种修改会报错
- console.log(obj.a); // 123
决定这个属性是否可枚举
- var obj = {
- b: 234,
- c: 897
- }
- Object.defineProperty(obj, 'a', {
- value: 123,
- enumerable: false
- })
- for (let key in obj) {
- console.log(key); // b、c
- }
configurable决定这个属性是否可配置
- var obj = {
- a: ''
- }
- Object.defineProperty(obj, 'a', {
- value: 123,
- writable: false,
- configurable: false
- })
- Object.defineProperty(obj, 'a', {
- writable: true
- })
- /*
- *Cannot redefine property: a
- at Function.defineProperty (
) - at test.html:28:10
- */
Object.preventExtensions
preventExtensions禁止向对象添加新的属性(可以配置、修改属性、删除属性)
-
- var obj = {
- a: 234
- }
- Object.preventExtensions(obj)
- obj.b = 456
- console.log(obj);
-
-
这个方法实际上会在现有的对象上调用Object.preventExtensions,除了不可添加新的属性还不可以配置属性、删除属性。(可以修改属性)
- var obj = {
- a: 234
- }
- Object.seal(obj)
- obj.a = 123
- delete obj.a
- console.log(obj); // {a:123}
这个属性会创建一个冻结对象,会在现有的对象上调用Object.seal并把 所有的属性标记为writable:false,无法修改它们。
- var obj = {
- a: 234
- }
- Object.freeze(obj)
- obj.a = 123
- console.log(obj); // {a:234}