ECMAscriptのObject.freezeメソッドを理解しようとしています。Javascript 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の最新バージョンを使用しています。どんな助けもありがとうございます。
このページの半分以下:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Freezeこれは言う:**次の例は、フリーズされたオブジェクトは突然変異することがあります(フリーズは浅いです)。**設計通りに動作するようです。 –