I. 前書き
「Javascriptではすべてがオブジェクトである」は間違いです。オブジェクトは7つの基本型です。
オブジェクトには関数を含むサブタイプがあり、サブタイプによって動作が異なります。Object.prototype.toString.call()を使えば、オブジェクトがどのサブタイプに属するかを確認することができます。
オブジェクトのサブタイプの配列であることを示します。
オブジェクトはキー/値のコレクションであり、 . または __[ ]__ 構文でオブジェクトのプロパティを取得できます。
オブジェクトのプロパティにアクセスするとデフォルトの__[[Get]]操作が実行され、プロパティを設定するとデフォルトの[[Put]]__操作が実行されます。
このオブジェクトのプロパティを取得するには、オブジェクトにそのプロパティが含まれているかどうかをチェックし、含まれていない場合は、__prototype chain__で調べます。
プロパティ 属性のプロパティは、属性記述子を通して制御できます。
II. 属性コントローラ
ES5 以降、すべてのプロパティはプロパティ記述子を持ちます。
let obj = {
a:2
}
console.log(Object.getOwnPropertyDescriptor(obj,'a'))
// value: 2, writable: true, enumerable: true, configurable: true }
1、プロパティ記述子には、書き込み可能、列挙可能、設定可能の3つの機能があります。
let obj = {}
Object.defineProperty(obj,"a",{
value:12,
writable: false,
enumerable:false,
configurable: false
})
console.log(obj.a)
console.log(Object.getOwnPropertyDescriptor(obj,'a'))
// 12
// { value: 12, writable: false, enumerable: false, configurable: false }
2.オブジェクトの属性を作成する場合、属性記述子はデフォルト値を使用します。Object.defineProperty
また、プロパティの追加や変更にも使用できます。
1.書き込み可能:属性の値を変更できるかどうかを決定します。
"use strict" let obj = {} Object.defineProperty(obj,"a",{ value:12, writable: false, enumerable:true, configurable: true }) console.log(obj.a) obj.a = 13 console.log(obj.a) // 12 // obj.a = 13 TypeError: Cannot assign to read only property 'a' of object '#<Object>' // 非厳密モードでは、2番目のobj.a = 12 データは不変である
writeable::falseは、プロパティがイミュータブル(不変)であると考えることができます。
- ただし、書き込み可能のステータスをtrueからfalseに変更することは可能ですが、falseからtrueに変更することはできません。
- オブジェクトのプロパティを削除するために delete メソッドを操作することはできません。
let obj = {} Object.defineProperty(obj,"a",{ value:12, writable: true, enumerable:true, configurable: false }) console.log(obj.a) obj.a = 13 console.log(obj.a) delete obj.a // TypeError: Cannot delete property 'a' of #<Object> Object.defineProperty(obj,"a",{ value:12, writable: true, enumerable:true, configurable: true }) console.log(Object.getOwnPropertyDescriptor(obj,'a')) // 12 // 13 // TypeError: Cannot redefine property: a
3, enumable: falseに設定すると、このプロパティは列挙に表示されませんが、普通にアクセスできます。
- オブジェクトのenumable:falseをfor-inで走査できない場合
let obj = {} Object.defineProperty(obj,"a",{ value:12, writable: true, enumerable:true, configurable: true }) Object.defineProperty(obj,"b",{ value:13, writable: true, enumerable:false, configurable: true }) console.log(obj) // { a: 12, b: 13 } for (let c in obj) { console.log(c) } // a
まとめ
1、書き込み可能で設定可能な値を設定することにより、実際の定数属性を作成するには、変更することはできません、再定義することはできません、削除することはできません。
2、オブジェクトに新しい属性を追加することを禁止する場合は
Object.preventExtensions()
Object.preventExtensions()
3,Object.seal()は "シールドされたオブジェクト "を作成します。4、Object.freeze()は凍結オブジェクトを作成し、実際にObject.seal()を呼び出し、オブジェクトを書き込み可能:falseに設定します。これは最高レベルの不変性です。