SOURCE

'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 命令行工具 X clear

                    
>
console