2016-05-23 3 views
1

JS内のオブジェクトの既存のプロパティを変更して割り当て後に不変にする方法があるのだろうかと思います。JSオブジェクトの既存のプロパティの書き込み可能性/可読性を変更する

基本的にはオブジェクトがありますが、オブジェクトの既存のプロパティをフリーズしたいが、新しいプロパティを追加できるようにしたい。

は、既存のプロパティを凍結することが可能であり、または私はそうのようObject.defineProperty使用する必要があります:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

私はそれが事実の後にプロパティのアクセス許可を変更することが可能です疑うが、私はかしら使用する秘密の秘訣があります。

私は、新しいプロパティを後で追加できるようにしたいので、Object.freezeが過剰になると思います。

あなたが見ることができるように、あなたがオブジェクトの後にプロパティを追加することはできません表示されますが、「凍結」

var z = Object.freeze({ 
 
    a: 'c' 
 
}); 
 

 
z.b = 'm'; 
 

 
console.log(z);

あり、このための動機は、私は、ライブラリを書いていますということで、ライブラリを使用している開発者がライブラリに属している既存のプロパティを上書きする場合は、/をスローします(エラーをスローします)。

このトピックでは、wthはObject.freezeとObject.sealの違いですか?

https://msdn.microsoft.com/en-us/library/ff806192(v=vs.94).aspx

できるだけ早く私はObject.seal見たように、私はオハイオ州のようでした!これは私が探しているものでなければなりません、そうではありません、Object.freeze、lameと同じように見えます。

+0

あなたは見てなかったhttps://facebook.github.io/immutable -js /? –

+0

はい、不変はおそらく動作しますが、不変のオブジェクトを最初に作成し、その事実の後にプロパティを変更しないといけません。 Immutableの問題は、プロトタイプ継承を行い、プロトタイプをフリーズする必要があることです。 –

答えて

1

Object.defineProperty()を使用し、既存のすべての属性に対してpermissonを設定するのはどうですか?例えば

https://jsfiddle.net/Luo80szt/

var myCar = new Object(); 
myCar.make = "Ford"; 
myCar.model = "Mustang"; 

Object.defineProperty(myCar, "make", { writable : false }); 

myCar.make ="BMW"; 
myCar.model ="Ranchero"; 
myCar.color ="white"; 


for(var key in myCar) { 
    console.log(myCar[key]); 
} 
私はただ一つの属性のために使用されるが、すべてのオブジェクトのプロパティを繰り返し処理することができます

+0

ああ、値を再割り当てする必要はありませんか?ちょうどそれらを変更する? –

+0

"writeable:false" assginmentの後、属性は変更できませんが、新しい属性を追加し続けることができます。 –

+0

ハァッ、これは動作するように見えます –

関連する問題