'use strict'
var obj = { a: 'wangaboqi' }
var objDescriptor = Object.getOwnPropertyDescriptor(obj, 'a')
// console.log(JSON.stringify(objDescriptor))
// 配置属性不可写入
Object.defineProperty(obj, 'a', {
writable: false,
enumerable: true,
value: 'wangbaoqi',
configurable: true
})
// obj.a = 3
// console.log(obj.a, 'not allow to write');
// 只要属性是可配置的,就可以使用 defineProperty(..) 方法来修改属性描述符
// configurable: false 禁止删除这个属性
Object.defineProperty(obj, 'a', {
writable: true,
enumerable: true,
value: 'wangbaoqi',
configurable: false
})
// 测试configurable
// Object.defineProperty(obj, 'a', {
// writable: true
// })
// TypeError
// delete obj.a
/**
* delete 只用来直接删除对象的(可删除)属性。如果对象的某个属性是某个
*对象函数的最后一个引用者,对这个属性执行 delete 操作之后,这个未引用的对象函对象 数就可以被垃圾回收。但是, 不要把 delete 看作一个释放内存的工具(就像 C/C++ 中那 样),它就是一个删除对象属性的操作
*/
// enumerable
// 不可变性
Object.preventExtensions(obj); //1. 阻止可扩展性
// obj.b = 3;
// console.log(obj.b, 'extensions'); // Uncaught TypeError: Cannot add property b, object is not extensible
Object.seal(obj); // 2. 密封对象 在阻止可扩展性的基础上 添加 属性 configurable: false
var sealDes = Object.getOwnPropertyDescriptor(obj, 'a')
console.log(JSON.stringify(sealDes)); // 属性 configurable: false
Object.freeze(obj); // 3. 冻结对象 在seal的基础上 添加 属性 writable: false
var freezeDes = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(JSON.stringify(freezeDes));
// 它会禁止对于对象本身及其任意直接属性的修改(不过就像我们之前说过的,这个对象引用的其他对象是不受影响的)。
console