此示例创建一个对象,冻结它,然后从冻结对象创建一个新对象.
如果第二个对象尝试更改测试属性,则不能.它仍然冻结
第一个对象的值为10.
如果第二个对象尝试更改测试属性,则不能.它仍然冻结
第一个对象的值为10.
//Create an object and freeze it var first = { test: 10 }; Object.freeze(first); //Create a second object from the first one and //try and change the new test property (you can't) var second = Object.create(first); second.test = 20; console.log(second.test); //10
这是我的问题:
是second.test一个新对象的新属性,还是只是对冻结的第一个对象的属性的引用?
可以使用冻结的first.test作为默认值,但是如果需要,则让second.test覆盖它?
我的原因是因为我想使一个不可变的基础对象作为具有默认值的模板,然后使用它来创建可以自定义的新对象.这是最好的方法?
谢谢!
解决方法
其实是一个新的对象,首先是第二个的原型.之所以
second.test = 20;
不工作是因为在分配时,它将寻找原型上的设置(即可配置,可枚举,可写,[[可扩展]]),如果其中任何一个都为假,则不分配给实例.要直接分配给实例,你必须在第二次使用Object.defineProperty:
var first = { test: 10 }; Object.freeze(first); var second = Object.create(first); Object.defineProperty(second,'test',{ value: 20,enumerable: true,configurable: true,writable: true }); console.log(second.test); // 20