Javascript Object.freeze()不阻止对对象进行更改

Javascript Object.freeze()不阻止对对象进行更改,javascript,oop,Javascript,Oop,我试图理解ECMAscript的Object.freeze方法 我的理解是,它基本上停止了对对象所有属性的更改。MDN文档说明: 防止向其添加新属性;防止现有财产被移除;并防止更改现有属性或其可枚举性、可配置性或可写性 情况似乎并非如此,但也许我误解了文件 这是我的对象,具有可枚举属性exampleArray function myObject() { this.exampleArray = []; } var obj = new myObject(); obj.exampleArra

我试图理解ECMAscript的Object.freeze方法

我的理解是,它基本上停止了对对象所有属性的更改。MDN文档说明:

防止向其添加新属性;防止现有财产被移除;并防止更改现有属性或其可枚举性、可配置性或可写性

情况似乎并非如此,但也许我误解了文件

这是我的对象,具有可枚举属性exampleArray

function myObject()
{
    this.exampleArray = [];
}

var obj = new myObject();
obj.exampleArray[0] = "foo";
现在,如果我冻结对象,我希望exampleArray属性也被冻结,因为它不能再以任何方式更改

Object.freeze(obj);
obj.exampleArray[1] = "bar";
console.log(obj.exampleArray.length); // logs 2
“bar”已添加到数组中,因此冻结的对象已更改。我的直接解决方案是冻结所需的财产:

Object.freeze(obj.exampleArray);
obj.exampleArray[2] = "boo";
现在,根据需要更改数组会抛出一个错误

然而,我正在开发我的应用程序,我还不知道将分配给我的对象什么。我的用例是,我有一些游戏对象,它们在游戏开始时被初始化(从XML文件)。在此之后,我不希望能够意外更改它们的任何属性

也许我误用了冻结法?我希望能够冻结整个对象,一种递归冻结。这里我能想到的最好的解决方案是循环遍历属性并冻结每个属性


我已经搜索了这个问题,唯一的答案是这是一个实现错误。我正在使用最新版本的Chrome。感谢您的帮助

Object.freeze是浅冻结

如果您查看中的描述,它会说:

无法更改数据属性的值。访问器属性(getter和setter)的工作原理是相同的(并且仍然给人一种错觉,即您正在更改值)请注意,作为对象的值仍然可以修改,除非它们也被冻结。

如果你想深度冻结一个物体,这里有

功能深度冻结(o){
冻结(o);
Object.getOwnPropertyNames(o).forEach(函数(prop){
如果(o.hasOwnProperty(prop)
&&o[prop]!==null
&&(o[prop]的类型==“对象”| | o[prop]的类型==“函数”)
&&!Object.isfronged(o[prop])){
深度冻结(o[prop]);
}
});
返回o;
}
函数myObject(){
this.exampleArray=[];
}
var obj=deepFreeze(新的myObject());
obj.exampleArray[0]=“foo”;

console.log(obj);//exampleArray保持不变
使用
对象将对象的属性描述符设置为
可写:false
可配置:false
。定义属性
;然后调用对象上的
Object.preventExtensions
。请参阅。

本页的下半部分:它说:下面的示例显示冻结对象中的对象值可以发生变异(冻结是浅的)。因此,它似乎按设计工作。