JS オブジェクト コンストラクター Object.freeze

JS オブジェクト コンストラクター Object.freeze

概要

Object.freeze(obj) はオブジェクトをフリーズすることができます。凍結されたオブジェクトは変更できなくなります。

オブジェクトが凍結されている場合、そのオブジェクトに新しいプロパティを追加したり、既存のプロパティを削除したり、既存のプロパティの列挙可能性、構成可能性、書き込み可能性を変更したり、既存のプロパティの値を変更したりすることはできません。

また、オブジェクトをフリーズした後は、オブジェクトのプロトタイプを変更することはできません。 freeze() は渡された引数と同じオブジェクトを返します。

JavaScriptデモ: Object.freeze()

定数オブジェクト = {
  プロップ: 42
}
オブジェクトをフリーズする(obj)

obj.prop = 33 // 厳密モードではエラーが発生します。

コンソールログ(obj.prop) // 42

1) オブジェクトをフリーズする

var obj = {
  プロパティ: 関数() {},
  foo:'バー'
}

// パラメータとして渡されたオブジェクトと返されたオブジェクトは両方とも凍結されるため、返されたオブジェクトを保存する必要はありません(両方のオブジェクトが等しいため)
var o = Object.freeze(obj)
o === obj // 真

// これからの変更は効果がありません obj.foo = 'he' // 何もしません Obj.hxx = 'he' // このプロパティを追加しないでください // Object.defineProperty 経由でプロパティを変更してみてください // 次の両方のステートメントは例外をスローします Object.defineProperty(obj,'foo',{value:'yy'})
Object.defineProperty(obj,'sex',{value:'女'})

// プロトタイプも変更できません // 次の 2 つのステートメントは例外をスローします Object.setPrototypeOf(obj,{x:20})
オブジェクト__prop__ = {x:20}

2) 配列をフリーズする

a = [0]とする
Object.freeze(a) // 配列は変更できなくなりました a[0] = 1 // 失敗 a.push(2) // 失敗

凍結されたオブジェクトは不変です。しかし、いつもこうなるわけではありません。以下は、凍結されたオブジェクトが定数オブジェクトではないことを示しています(浅い凍結)

3) 浅い凍結

obj = {
  内部: {}
}

オブジェクトをフリーズする(obj)
obj.internal.a = '彼'
console.log(obj.internal.a) // 彼

オブジェクトを不変にするには、オブジェクト型のすべてのプロパティを再帰的に凍結する必要があります(ディープフリーズ)

4) ディープフリーズ

deepFreeze = (obj) => {
  var propNames = Object.getOwnPropertyNames(obj);
  propNames.forEach(関数 (名前) {
    var prop = obj[名前];
    if (typeof prop == 'object' && prop !== null) {
      deepFreeze(プロパティ);
    }
  });
  オブジェクトをフリーズします。
}


deepFreeze1 = (obj) => {
  var prop、propName
  オブジェクトをフリーズする(obj)
  (propName in obj) の場合 {
    prop = obj[propName]
    if (!obj.hasOwnProperty(propName) || !(typeof prop === "object") || Object.isFrozen(prop)) {
      // プロトタイプ チェーンと凍結されたオブジェクトのプロパティをスキップします。
      続く
    }
    deepFreeze1(プロップ)
  }
}

ディープフリーズを使用するのは、通常、プロパティが必要なのに、それが空であるか、最初は存在しない場合に、初期値を設定するだけです。

タイトル: 「フロアセールス」、
価値: ""、
オプション: [],

存在の意味

巨大な配列またはオブジェクトがあり、データが変更されないことが確実な場合は、Object.freeze() を使用するとパフォーマンスが大幅に向上します。 Object.freeze() は値を固定しますが、変数への参照を置き換えることは可能です。

新しいビュー({
  データ: {
    // Vue はリスト内のオブジェクトにゲッターとセッターをバインドしません list: Object.freeze([
      { 値: 1 },
      { 値: 2 }
    ])
  },
  マウントされた(){
     // インターフェースは応答しません this.list[0].value = 100;


     // 次の2つのメソッドは this.list = [ に応答します。
       { 値: 100 },
       { 値: 200 }
     ];
     this.list = Object.freeze([
       { 値: 100 },
       { 値: 200 }
     ]);
  }
})

以上がJS ObjectコンストラクタのObject.freezeの詳しい内容です。JS Object.freezeの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • JavaScript の知識: コンストラクタも関数である
  • JavaScriptコンストラクタの原理と実装プロセスの分析
  • JavaScript クラスの継承とインスタンス化の方法
  • JavaScript でインスタンス化オブジェクトを new を使用する場合と使用しない場合の違い
  • JavaScriptのコンストラクタとインスタンス化オブジェクトについての簡単な説明
  • JavaScript のプロトタイプとプロトタイプチェーンの詳細な説明
  • JavaScript プロトタイプオブジェクトの this ポイント問題の詳細な説明
  • JSコンストラクタとインスタンス化およびプロトタイプ導入の関係

<<:  Java+Tomcat 環境の展開とインストールのプロセス図

>>:  便利でシンプルなMySQL関数10個

推薦する

Vue ベースの円形スクロールリスト機能を実装する

注: 親コンテナーに高さと :data='Array' および overfolw:h...

MySQL の where と on の違いと、いつ使用するか

以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生...

Ubuntu ターミナル マルチウィンドウ 分割画面 ターミネーター

1. インストールターミネーターの最大の特徴は、1つのウィンドウで複数のターミナルを開くことができる...

Linux でパスワードを入力せずに sudo コマンドを実行する方法

sudo コマンドを使用すると、信頼できるユーザーは別のユーザー (デフォルトでは root ユーザ...

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...

Nginx サービスを使用してサブドメイン環境を構築し、2D マップの読み込みパフォーマンスを向上させる方法を説明します。

1. 背景最近、友人が大規模なマップの読み込みが遅いという問題に遭遇しました。iServer のパ...

Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

Linux は現在最も広く使用されているサーバー オペレーティング システムです。Unix をベー...

Ubuntuデュアルシステムが起動時に停止する問題の解決方法の詳細な説明

起動時に Ubuntu デュアル システムが停止する問題の解決方法 (Ubuntu 16.04 およ...

JS の 3 つの主要な問題、非同期性とシングルスレッドについて簡単に説明します。

目次シングルスレッド非同期シングルスレッドしかし、開発中にネットワーク リクエストやスケジュールされ...

Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...

VMware仮想マシンにLinux(CentOS)をインストールするための詳細な構成手順

CentOS7をダウンロード私がダウンロードしたイメージはCentOS-7-x86_64-DVD-1...

Springboot プロジェクトに動的にパラメータを渡すための Docker の実装方法

背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...

Mysql 5.7.19 無料インストール バージョンで遭遇した落とし穴 (コレクション)

1. 公式ウェブサイトから 64 ビットの zip ファイルをダウンロードします。 2. インスト...

CSS フレキシブルレイアウト FLEX、メディアクエリ、モバイルクリックイベントの実装

フレックスレイアウト定義: Flexレイアウトの要素は、 Flex 、または略して「コンテナー」と呼...

MySQLのカバーインデックスに関する知識ポイントのまとめ

インデックスにクエリする必要があるすべてのフィールドの値が含まれている(またはカバーしている)場合、...