2016-05-23 4 views
0

私は以下の機能が必要です。私はオブジェクトの既存のプロパティをフリーズしたいが、新しいプロパティを追加できるようにする。何らかの理由で、Object.freezeExisting()の機能がないようですが、プロトタイプの既存のプロパティをフリーズするオプションを使用して実装する価値があると思います。Object.seal、Object.freeze、Object.preventExtensionsの代替手段を実装する

どうすればいいのかわかりません。これはいくつかのコードですが、これはまったく正しいことではありません。パフォーマンスはそれほど気にせず、100%作業しなければなりません。

Object.freezeExistingProps = function(obj, modifyProto){ 

    Object.keys(obj).forEach(function(key){ 

     const val = obj[key]; 

     Object.defineProperty(obj, key , { //we simply overwrite existing prop 
      value: val, 
      writable: false, // important, I think 
      enumerable: true, 
      configurable: false 
     }); 


    }); 

    return obj; 

}; 

しかし、私は上記の健全性チェックが必要です。また、プロトタイプチェーンをどのようにダウンして、実際のObject.prototypeを使いこなす前に何とか止めることができるかについての情報が必要です。

+0

'hasownproperty'は、私はあなたが探していると思うものです。 – Jai

+0

[Javascript:Objectはメソッド 'freeze'をサポートしていません](http://stackoverflow.com/questions/13117771/javascript-object-doesnt-support-method-freeze) –

+1

"*既存のプロパティをフリーズするプロトタイプ* "はあまり意味がありません。拡張機能を禁止しないと、プロトタイプは他のオブジェクト用にスワップアウトされる可能性があります。プロトタイプチェーンの一部だけをフリーズしようとすると、これはさらに疑わしいものになります。継承されたプロパティをオブジェクト自体にコピーし、それらをフリーズすることを検討することをお勧めします。 – Bergi

答えて

3

あなたは簡単に拡張を自分で妨げることなくsetIntegrityLevel algorithmを実装することができます

Object.freezeExisting = function(o) { 
    for (const key of Reflect.ownKeys(o)) { 
     const desc = Object.getOwnPropertyDescriptor(o, key); 
     if (!desc) 
      continue; 
     if ("value" in desc) 
      Object.defineProperty(o, key, {configurable: false, writable: false}); 
     else 
      Object.defineProperty(o, key, {configurable: false}); 
    } 
    return o; 
}; 
+0

仕様から "If * currentDesc *が未定義でない"チェックを削除しました。しかし、それらのプロパティに関する '新しいProxy({}、{ownKeys:()=> [" a "}})のようなプロキシでは必要かもしれません。 – Oriol

+0

@Oriol:ああ、 'ownKeys'のキーに対して' currentDesc'が 'undefined'となるケースを見つけようとしましたが、失敗しました。しかし、あなたは正しい、プロキシはこれを行うことができます。更新しました。 – Bergi