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個

推薦する

nginx がドメイン名アクセス用に設定されている場合にドメイン名の後に 2 つのスラッシュ // が表示される問題の解決方法

最近、個人のウェブサイトを書き直しました。Alibaba Cloudで新しいサーバーを購入しました。...

Vue+Openlayerはmodifyを使用して要素の完全なコードを変更します

Vue+Openlayerはmodifyを使って要素を変更します。具体的な内容は以下のとおりです。 ...

Linux におけるゼロコピー技術の使用に関する簡単な分析

この記事では、Linux におけるいくつかの主要なゼロコピー テクノロジと、ゼロコピー テクノロジを...

RedHat 6.5/CentOS 6.5 に MySQL 5.7.20 をインストールするための詳細なチュートリアル

rpmインストールパッケージをダウンロードするMySQL公式サイト: https://dev.mys...

中国のウェブサイトユーザーエクスペリエンスランキング

<br />ユーザーエクスペリエンスは中国のウェブサイトでますます重視されており、ユーザ...

Linux で open-vswitch をインストールおよびアンインストールする方法

1. ソースコードからovsをコンパイルしてインストールします。依存関係をインストールします: # ...

MySQLのサブクエリユニオンの効率性についての簡単な説明と

最近の製品テストでは、同時呼び出し数が 10 未満の場合に応答時間が 100 ミリ秒以内に維持できな...

CSS を使用して半透明の背景と不透明なテキストを実現する例

この記事では、CSS を使用して半透明の背景と不透明なテキストの効果を実現する方法の例を紹介します。...

MySQL OOM (メモリオーバーフロー) の解決策

OOM は「Out Of Memory」の略で、メモリオーバーフローを意味します。メモリ オーバーフ...

Vue cli開発に基づく外部コンポーネントVantのデフォルトスタイルの変更の詳細な説明

目次序文1. 少ない2. コンポーネントをインポートする3. 設定ファイルを変更するステップ1: l...

docker を使用して複数のネットワーク インターフェースを持つコンテナーを起動する方法の例

コンテナにネットワークインターフェースを追加する1 デフォルトのネットワークモードでコンテナを実行す...

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...

Linux での mysql-5.7.28 インストール チュートリアル

1. 公式ウェブサイトから Linux バージョンをダウンロードします: https://dev.m...

最もよく使用されるJavaScriptイベントについて詳しく学ぶ

目次JavaScript イベント:よく使用されるイベント:イベントアクション要約するJavaScr...

Ubuntu環境でxdebugをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で xdebug をコンパイルしてインストールする方法について説明し...