ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript オブジェクトでできることのいくつか

JavaScript オブジェクトでできることのいくつか

hzc
hzc転載
2020-06-06 17:17:002020ブラウズ

通常のオブジェクト プロパティの割り当てとトラバーサルに加えて、JavaScript オブジェクトを使用して他の多くの操作を実行することもできます。この記事では、内部プロパティへのアクセス、プロパティ記述子の操作、読み取り専用プロパティの継承など、それらの使用方法を学びます。

1. 内部プロパティへのアクセス


JavaScript オブジェクトには、従来の方法ではアクセスできない内部プロパティがあります。内部プロパティ名は角括弧 [[]] で囲まれており、オブジェクトの作成時に使用できます。

内部プロパティは既存のオブジェクトに動的に追加できません。

内部プロパティは、ECMAScript 仕様で指定された内部状態を保存する一部の組み込み JavaScript オブジェクトで使用できます。

内部プロパティは 2 つあり、1 つはオブジェクトを操作するためのメソッド、もう 1 つはデータを保存するためのメソッドです。例:

  • [[Prototype]] — オブジェクトのプロトタイプ。null またはオブジェクト

  • [[Extensible] ] — 許可されるかどうかを示します。 新しいプロパティをオブジェクトに動的に追加します。

  • #[[PrivateFieldValues]] — プライベート クラス フィールドの管理に使用されます。

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


データ属性には、値の読み取りおよび書き込みが可能なデータ値の場所が含まれます。言い換えれば、データ属性は Object.Attributes を通じてアクセスできます。つまり、データ属性は通常やり取りするユーザーによって割り当てられた値を返し、余分なことは何も行いません。

データ属性には、その動作を説明する 4 つの特性があり (内部値を表すために、属性は 2 つの角括弧で囲まれています)、これは記述子オブジェクトと呼ばれます。

値記述子は属性のデータ値です。たとえば、次のオブジェクトがあります:

let foo = {
  a: 1}

この場合、a の値属性記述子は 1 です。

書き込み可能とは、属性の値を変更できるかどうかを指します。デフォルト値は true で、プロパティが書き込み可能であることを意味します。ただし、さまざまな方法で書き込み不可能にすることができます。

構成可能とは、オブジェクトのプロパティを削除したり、そのプロパティ記述子を変更したりできることを意味します。デフォルト値は true で、これは構成可能であることを意味します。

enumerable は、for...in ループで走査できることを意味します。デフォルト値は true で、for-in ループを通じてプロパティを返すことができることを意味します。

返された配列にプロパティ キーを追加する前に、Object.keys メソッドは列挙可能な記述子もチェックします。ただし、Reflect.ownKeys メソッドはこのプロパティ記述子をチェックせず、代わりにすべての独自のプロパティ キーを返します。

プロトタイプ記述子には他のメソッドがあり、get と set はそれぞれ値の取得と設定に使用されます。

新しいオブジェクトを作成するときは、次に示すように、Object.defineProperty メソッドを使用して記述子を設定できます。

let foo = {
  a: 1}Object.defineProperty(foo, 'b', {
  value: 2,
  writable: true,
  enumerable: true,
  configurable: true,});

foo の新しい値は {a: 1, b: 2 です。 } .
defineProperty を使用して、既存のプロパティの記述子を変更することもできます。例:

let foo = {
  a: 1}Object.defineProperty(foo, 'a', {
  value: 2,
  writable: false,
  enumerable: true,
  configurable: true,});

したがって、次のような値を foo.a に割り当てようとすると、:

foo.a = 2;

厳密モー​​ドがオフの場合、ブラウザはそれを無視し、そうでない場合はスローします。書き込み可能であるためのエラーは false に設定され、プロパティが書き込み可能ではないことを示します。
以下に示すように、defineProperty を使用してプロパティをゲッターに変換することもできます:

'use strict'let foo = {  a: 1}Object.defineProperty(foo, 'b', {  get() {    return 1;
  }
})

次のように書くと:

foo.b = 2;

b プロパティはゲッター プロパティであるため、厳密モードを使用すると、「Getter プロパティを再割り当てできません」というエラーが発生します。

3. 継承された読み取り専用プロパティは割り当てられません


継承された読み取り専用プロパティは割り当てられません。これは当然のことであり、このように設定したので、プロパティは継承されるため、プロパティを継承するオブジェクトに伝播する必要があります。

以下に示すように、Object.create を使用して、プロトタイプ オブジェクトからプロパティを継承するオブジェクトを作成できます。

const proto = Object.defineProperties({}, {
  a: {
    value: 1,
    writable: false
  }})const foo = Object.create(proto)

上記のコードでは、proto.a の書き込み可能な記述子を次のように設定します。 false なので、別の値を割り当てることはできません。

次のように記述すると:

foo.a = 2;

strict モードでは、エラー メッセージが表示されます。

概要


私たちは JavaScript オブジェクトを使って、私たちが知らないかもしれない多くのことを行うことができます。

まず、一部の JavaScript オブジェクト (組み込みブラウザ オブジェクトなど) には、二重角括弧で囲まれた内部プロパティがあり、オブジェクトの作成によって動的に追加できない内部状態を持っています。

JavaScript オブジェクトのプロパティにはプロパティ記述子もあり、これを使用して、値を制御できるかどうか、プロパティ記述子を設定できるかどうか、またはプロパティ記述子を変更できるかどうかなどを制御できます。

defineProperty を使用して、プロパティのプロパティ記述子を変更できます。また、新しいプロパティとそのプロパティ記述子を追加するためにも使用されます。

最後に、継承された読み取り専用プロパティは読み取り専用のままですが、親プロトタイプ オブジェクトから継承されるため、これは当然のことです。

推奨チュートリアル:「javascript チュートリアル

以上がJavaScript オブジェクトでできることのいくつかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。