blog

オブジェクトのプロパティ記述子

I. 前書き\n「すべてはオブジェクトである」は間違いです。オブジェクトは7つの基本型です。\nオブジェクトには関数を含むサブタイプがあり、サブタイプによって動作が異なります。これは...

Oct 6, 2020 · 3 min. read
シェア

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に設定します。これは最高レベルの不変性です。

Read next

アウトソーシングの落とし穴とヒント

1.しかし、どんな迷いがあっても、ピックアップしないでください。アウトソーシングを受けるには多くの方法があります。アウトソーシングプラットフォームから直接探しに行くこともできますし、フォーラムに戻って投稿することもできますし、友達にマッチングしてもらうこともできます。ここで言う友達とは、あなたのレベルや技術スタックをよく知っている人のことで、ただの知らない人ではなく、あなたがプログラマーであることだけを知っていて、プログラムを書くことがどういうことなのかさえ知らないような人でもありません。 違う...

Oct 6, 2020 · 6 min read

アプレット一般支払い

Oct 5, 2020 · 10 min read

プロミスを手書きする

Oct 5, 2020 · 3 min read

ネジの導入と使用

Oct 4, 2020 · 3 min read