要记住Object.defineProperty
可不只有get和set两个属性哦~
属性:
configurable有点变态,主要说一下:
var b = Object.creat(null);
Object.defineProperty(b, "a", {
configurable: true,
writable: false,
value: "fuck"
});
总结: configurable为false时,writable可以由true改为 false,但是不能由false改为true。其他行为都不可以修改。
应用:
先介绍下object.preventExtensions(...)
:个人觉得这个方法没什么可单独使用的场景。使用该方法之后对象的确是不能拓展了,但是已有属性TMD可被删。
Object.seal()
会创建一个密封的对象,这个方法实际上会在一个现有对象上调用object.preventExtensions(...)
并把所有现有属性标记为configurable:false。
所以, 密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以改属性的值)Object.freeze()
会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal()
,并把所有现有属性标记为writable: false,这样就无法修改它们的值。你可以深度冻结一个对象,具体方法为,首先这个对象上调用Object.freeze()
然后遍历它引用的所有对象,并在这些对象上调用Object.freeze()
。补充:
我们平时使用var a = {}
定义的对象,configurable、enumerable、writable默认值都为true,而value为你自己设定的值,如果不设定的话则为undefined。
参考: