1、遍历所有属性和方法
2、修改遍历到的属性的描述
3、Object.seal()
Object.defineProperty(Object,'freezePolyfill',{ value:function(obj){ var i; //遍历属性和方法 for(i in obj){ if(obj.hasOwnProperty(i)){ Object.defineProperty(obj,i,{ //修改遍历到的属性 writable:false }); } } Object.seal(obj); } });
如果对象的其中一个属性又是对象,那么这个对象中的对象里的属性是可以被修改的。可以使用递归判断外层对象的属性是否为对象,再重新使用freezePolyfill()方法去套。(不使用递归而使用迭代的方式也可以):
Object.defineProperty(Object,'freezePolyfill',{ value:function(obj){ var i; for(i in obj){ if(obj.hasOwnProperty(i)){ //判断属性是否为对象 if(typeof(obj[i]) === 'object'){ //迭代freezePolyfill方法 Object.freezePolyfill(obj[i]); }else{ Object.defineProperty(obj,i,{ writable:false }); } } } Object.seal(obj); } });
应用:
const xiaoming = { age:14, name:'小明', obj:{ a:1 } }; Object.freezePolyfill(xiaoming);
总结:
Object.defineProperty(obj,name,value)这个方法可以往一个对象上添加一个属性。第一个参数为对象名,第二个参数为属性名,第三个参数为属性值及描述。
Object.seal(变量名)方法可以阻止对象被扩展,但是无法阻止对象被修改。可以使用defineProperty()将对象属性设置为只读。
上述两个方法结合起来可以简单的达到一个Ojbect.freeze()的效果。
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj
- 要在其上定义属性的对象。
prop
- 要定义或修改的属性的名称。
descriptor
- 将被定义或修改的属性描述符。