プロパティ記述子

オブジェクト プロパティの操作の大部分は、通常は オブジェクト リテラルの作成、設定とアクセスなど、 プロパティ値をキーで表します。ただし、サービス アカウントの任意のプロパティを これらのプロパティへのアクセス方法をきめ細かく制御するためのオブジェクトです。 定義できます。すべてのオブジェクト プロパティには非表示の属性のセットがある そのプロパティに関連付けられたメタデータを含む 作成します。

各プロパティに関連付けられた記述子は 2 種類あります。 データ記述子とアクセサ記述子があります。データ記述子には、 プロパティの値を含む Key-Value ペアの一意の ID です。 書き込み可能、構成可能、または列挙可能です。アクセサー記述子には以下が含まれます。 プロパティの設定、変更、アクセス時に実行される関数です。

プロパティ 記述子のタイプ
Object.defineProperty() からのデフォルト値
説明
[[Value]] データ undefined プロパティの値が含まれます。
[[Writable]] データ false プロパティの値を変更できるかどうかを決定します。
[[Get]] アクセサー undefined プロパティの getter 関数は、 プロパティへのアクセスを制御します。
[[Set]] アクセサー undefined プロパティのセッター関数。この関数は プロパティが設定または変更された場合です。
[[Configurable]] 両方 false これが false の場合、プロパティは削除できません。 属性は変更できません。これが false で、 [[Writable]]true の場合、プロパティの値は 変更されることはありません。
[[Enumerable]] 両方 false これが true の場合は、次のコマンドを使用してプロパティを反復処理できます。 for...in ループまたは Object.keys() 静的 メソッドを呼び出します。

これらの各プロパティでは、[[Prototype]] と同じ省略形を使用して、 直接アクセスすることを意図していないことが わかります代わりに、 Object.defineProperty() 静的メソッドを使用して、オブジェクトのプロパティを定義または変更する 渡されます。Object.defineProperty() は、3 つの引数(操作対象のオブジェクト、 作成または変更するプロパティキーと、 ディスクリプタ。

デフォルトでは、Object.defineProperty() を使用して作成されたプロパティは 書き込み、列挙、構成はできません。ただし、作成したプロパティには ドットまたは角括弧の表記を使用しても、 書き込み可能、列挙可能、構成が可能です

const myObj = {};

Object.defineProperty(myObj, 'myProperty', {
  value
: true,
  writable
: false
});

myObj
.myProperty;
> true

myObj
.myProperty = false;

myObj
.myProperty;
> true

たとえば、[[Writable]] の値が false の場合に、新しい値を設定しようとする場合です。 関連プロパティの場合、strict モード以外では通知なく失敗し、 厳格モードのエラー:

{
   
const myObj = {};

   
Object.defineProperty(myObj, 'myProperty', {
    value
: true,
    writable
: false
   
});

    myObj
.myProperty = false;
    myObj
.myProperty;
}
> true

(function () {
   
"use strict";
   
const myObj = {};

   
Object.defineProperty(myObj, 'myProperty', {
    value
: true,
    writable
: false
   
});

    myObj
.myProperty = false;
    myObj
.myProperty;
}());\
> Uncaught TypeError: "myProperty" is read-only

記述子の効果的な使用はかなり高度なコンセプトですが、 物体の内部構造を理解することは より一般的な方法でオブジェクトを操作する場合の構文を学びました。たとえば これらの概念は、Object.create() 静的メソッドを使用するときに有効になりますが、 これにより、新しいリソースにアタッチされたすべてのプロトタイプを 渡されます。

Object.create() は、既存のオブジェクトを名前として使用して、新しいオブジェクトを作成します。 説明します。これにより、新しいオブジェクトはプロパティとメソッドを別の ユーザー定義のオブジェクトのプロパティを継承する方法と JavaScript の組み込み Object プロトタイプ。次のようにして Object.create() を呼び出すと、 渡すと、渡されたオブジェクトを含む空のオブジェクトが作成されます。 作成しました。

const myCustomPrototype = {
 
'myInheritedProp': 10
};

const newObject = Object.create( myCustomPrototype );

newObject
;
> Object {  }
<prototype>: Object { myInheritedProp: 10 }
  myInheritedProp
: 10
 
<prototype>: Object { }

Object.create は、対象属性の独自のプロパティを指定する 2 番目の引数を Object.defineProperty() のような構文を使って新しく作成されます。 つまり、次の記述子属性のセットにキーをマッピングするオブジェクト:

const myCustomPrototype = {
 
'myInheritedProp': 10
};

const myObj = Object.create( myCustomPrototype, {
        myProperty
: {
            value
: "The new property value.",
            writable
: true,
            configurable
: true
       
}
 
});

myObj
;
> Object { }
    myProperty
: "The new property value."
   
<prototype>: Object { myInheritedProp: 10 }

この例では、新しいオブジェクト(myObj)はオブジェクト リテラルを使用しています。 (myCustomPrototype)がプロトタイプとして返されます。これは、継承された Object.prototype という構造の一連の継承されたプロトタイプが、 プロトタイプ チェーン。各オブジェクトには、割り当てか継承かにかかわらず、プロトタイプ 独自のプロトタイプが割り当てられているか継承されています。このチェーンの終点: null プロトタイプ。独自のプロトタイプはありません。

const myPrototype = {
 
'protoProp': 10
};

const newObject = Object.setPrototypeOf( { 'objProp' : true }, myPrototype );

newObject
;
> Object { objProp: true }
    objProp
: true
   
<prototype>: Object { protoProp: 10 }
        protoProp
: 10
       
<prototype>: Object { }

値のプロトタイプに含まれるプロパティは「トップレベル」で使用できます プロトタイプ プロパティに直接アクセスする必要はありません:

const objectLiteral = {
   
"value" : true
};

objectLiteral
;
> Object { value: true }
    value
: true
   
<prototype>: Object { }

objectLiteral
.toString();
"[object Object]"

このパターンは、サービスに関連付けられたプロトタイプ チェーン全体に : プロパティにアクセスしようとすると、インタープリタはそのプロパティを 各「level」プロパティでプロトタイプ チェーンが上から下へと順に プロパティまたはチェーンの終点を見つけます。

const myCustomPrototype = {
 
'protoProp': "Prototype property value."
};

const myObj = Object.create( myCustomPrototype, {
    myProperty
: {
        value
: "Top-level property value.",
        writable
: true,
        configurable
: true
   
}
});

myObj
.protoProp;
> "Prototype property value."

理解度をチェックする

アクセサとなる記述子

[[Get]]
[[Set]]
[[Writable]]