2016-12-27 26 views
0

これはどんなタイプのタイプをも凍結するのに十分ですか?Deep Freeze任意のタイプ

function freeze(obj) { 
    if (typeof obj === 'object') { 
    Reflect.ownKeys(obj).forEach((key) => {freeze(obj[key])}); 
    } 

    return Object.freeze(obj); 
} 
+0

関数もオブジェクトですが、 'typeof'は' function'を返します:\ –

+0

オブジェクトグラフ全体をフリーズする理由について詳しく説明できますか? –

答えて

1

いいえ、残念ながら、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

他のいくつかの問題/ノート:

  • As Matías said、関数はオブジェクトですが、typeofは彼らのためにあなたに"function"を与えるだろう。
  • Reflect.ownKeysは、オブジェクトの自身のキーのみを提供し、プロトタイプのキーは提供しません。だからあなたの定義に応じて、オブジェクトをフリーズする前に継承されたプロパティをオブジェクトにコピーする必要があります。
+0

また、もし誰かが 'Object.freeze()'を実行していればスカラー型に問題はありませんか?ただ疑問に思う。 –

+0

@IsmaelMiguel:良い点、最後の 'Object.freeze'もおそらく' if'ブロック内にあるはずですが、 'Object.freeze' [非オブジェクトのためのノーオペレーション](http:// www.ecma-international.org/ecma-262/7.0/index.html#sec-object.freeze)、問題ではありません。コンストラクタをフリーズすると、それは問題になるとは思われません(しかし、私はユーザがとにかく関数をフリーズしたくないと思っています)。 –

+0

私はまた、それは非常に重い操作だと付け加えます。パフォーマンスが痛い。結局のところ、再帰的なオブジェクトプロパティの再定義です。数年前、私はいくつかのJSライブラリを開発し、オブジェクトをフリーズしていました。そして、ついにJSは動的型言語なので、ダックタイピングの良い友達です。 –

関連する問題