これはどんなタイプのタイプをも凍結するのに十分ですか?Deep Freeze任意のタイプ
function freeze(obj) {
if (typeof obj === 'object') {
Reflect.ownKeys(obj).forEach((key) => {freeze(obj[key])});
}
return Object.freeze(obj);
}
これはどんなタイプのタイプをも凍結するのに十分ですか?Deep Freeze任意のタイプ
function freeze(obj) {
if (typeof obj === 'object') {
Reflect.ownKeys(obj).forEach((key) => {freeze(obj[key])});
}
return Object.freeze(obj);
}
いいえ、残念ながら、JavaScriptにはまだ方法がありません。例えば、Date
インスタンスが凍結することができません。
var dt = new Date(2016, 11, 27);
console.log(dt.getDate()); // 27
Object.freeze(dt);
dt.setDate(dt.getDate() + 1);
console.log(dt.getDate()); // 28
他のいくつかの問題/ノート:
typeof
は彼らのためにあなたに"function"
を与えるだろう。Reflect.ownKeys
は、オブジェクトの自身のキーのみを提供し、プロトタイプのキーは提供しません。だからあなたの定義に応じて、オブジェクトをフリーズする前に継承されたプロパティをオブジェクトにコピーする必要があります。また、もし誰かが 'Object.freeze(
@IsmaelMiguel:良い点、最後の 'Object.freeze'もおそらく' if'ブロック内にあるはずですが、 'Object.freeze' [非オブジェクトのためのノーオペレーション](http:// www.ecma-international.org/ecma-262/7.0/index.html#sec-object.freeze)、問題ではありません。コンストラクタをフリーズすると、それは問題になるとは思われません(しかし、私はユーザがとにかく関数をフリーズしたくないと思っています)。 –
私はまた、それは非常に重い操作だと付け加えます。パフォーマンスが痛い。結局のところ、再帰的なオブジェクトプロパティの再定義です。数年前、私はいくつかのJSライブラリを開発し、オブジェクトをフリーズしていました。そして、ついにJSは動的型言語なので、ダックタイピングの良い友達です。 –
関数もオブジェクトですが、 'typeof'は' function'を返します:\ –
オブジェクトグラフ全体をフリーズする理由について詳しく説明できますか? –