zoukankan      html  css  js  c++  java
  • JavaScript 对象的防篡改preventExtensions/seal/freeze

    	// 首先声明三个对象
    	const a = {v: 1};
    	const b = {v: 1};
    	const c = {v: 1};
    	
    	/*
    	Object.preventExtensions() 方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
    	
    	Object.seal() 方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
    	
    	Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
    	*/
    	Object.preventExtensions(a);
    	Object.seal(b);
    	Object.freeze(c);
    	
    	/*
    	Object.getOwnPropertyDescriptors() 用来获取一个对象的所有自身属性的描述符(结构是否可改变, 是否可枚举, 属性是否可更改)。
    	* 1.configurable:表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true;
    	* 2.enumerable: 表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为true;
    	* 3.writable: 能否修改属性的值,如果直接使用字面量定义对象,默认值为true;
    	* 4.value: 该属性对应的值,默认为undefined。
    	* */
    	console.log(Object.getOwnPropertyDescriptors(a)); // => {v: {value: 1, writable: true, enumerable: true, configurable: true}}
    	console.log(Object.getOwnPropertyDescriptors(b)); // => {v: {value: 1, writable: true, enumerable: true, configurable: false}}
    	console.log(Object.getOwnPropertyDescriptors(c)); // => {v: {value: 1, writable: false, enumerable: true, configurable: false}}
    	
    	// 下面开始修改对象
    	a.v = 2;
    	a.k = 0;
    	
    	b.v = 2;
    	b.k = 0;
    	
    	c.v = 2;
    	c.k = 0;
    	
    	console.log(a); // => {v: 2} // 可修改不可添加
    	console.log(b); // => {v: 2} // 可修改不可添加
    	console.log(c); // => {v: 1} // 不可修改不可添加
    	
    	/*
    	Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
    	* */
    	console.log(Object.isExtensible(a)); // => false
    	console.log(Object.isExtensible(b)); // => false
    	console.log(Object.isExtensible(c)); // => false
    	/* 均为不可扩展 */
    	
    	// 再来使用delete操作对象
    	
    	delete a.v;
    	delete b.v;
    	delete c.v;
    	
    	console.log(a); // => {} // 可删除
    	console.log(b); // => {v: 2} // 不可删除
    	console.log(c); // => {v: 1} // 不可删除
    	
    	/*
    	结论
    	* preventExtensions 可删除和修改源属性,不可添加新属性
    	* seal 可修改但是不可删除源属性,不可添加新属性
    	* freeze 不可修改和源属性,不可添加新属性
    	* !* 三者都不可扩展新属性
    	* */
    
    
    为之则易,不为则难。
  • 相关阅读:
    数据库操作类
    并查集的使用
    简单的图片识别,源代码
    Sql Server清理缓存代码
    京东商城商品价格获取方法
    【转】 SEO的含义与意义
    隐藏控制台窗口的方法
    MySQL存储过程详解
    常见电商B2C网站购物车的设计
    UML建模之业务处理模型(Business Process Model,BPM)
  • 原文地址:https://www.cnblogs.com/coderDemo/p/13395786.html
Copyright © 2011-2022 走看看