js でオブジェクトを作成するさまざまな方法とその長所と短所のまとめ

js でオブジェクトを作成するさまざまな方法とその長所と短所のまとめ

初期作成方法

var obj = 新しいオブジェクト()
オブジェクト名 = 'xxx'
オブジェクト年齢 = 18
またはオブジェクトリテラルvar o1 = {を使用します
  名前: 'xxx',
  言う: () => {}
}
var o2 = {
  名前: 'xxx',
  言う: () => {}
}

デメリット: 同じインターフェースを使用して多くのオブジェクトを作成すると、重複するコードが大量に生成される

ファクトリーパターン

関数ファクトリー(名前,年齢) {
  var obj = 新しいオブジェクト()
  obj.name = 名前
  obj.age = 年齢
  オブジェクトを返す
}
var o1 = ファクトリー(1, 11)
var o2 = ファクトリー(2, 22)

利点: 複数の類似オブジェクトを作成するコード重複の問題を解決します。欠点: オブジェクトの種類を識別できません。

コンストラクターパターン

ECMAScript では、Object や Array などのネイティブ コンストラクターなど、特定のタイプのオブジェクトを作成するためにコンストラクターを使用できます。さらに、カスタム コンストラクターを作成して、カスタム オブジェクトのプロパティとメソッドを定義することもできます。

関数 Person(名前, 年齢) {
  this.name = 名前
  this.age = 年齢
  this.sayName = 関数() {
    console.log(この名前)
  }
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.名前を言う() // 1
o2.名前を言う() // 2

利点: コンストラクターモードで作成されたインスタンスは、型識別子を区別できます (instanceof 判断)
デメリット: 各メソッドをインスタンス上で再作成する必要があります。たとえば、2 つのインスタンスの sayName メソッドは同じタスクを持ちますが、実際には 2 つの Function インスタンスを作成します。

コンストラクタパターンの最適化

関数 Person(名前, 年齢) {
  this.name = 名前
  this.age = 年齢
}
関数 sayName() {
  console.log(この名前)
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.名前を言う() // 1
o2.名前を言う() // 2

利点: 複数のインスタンスがグローバル スコープで定義された関数を共有するため、2 つの関数が同じことを実行するという問題が解決されます。欠点: グローバル スコープで定義された関数は、実際には特定のオブジェクトによってのみ呼び出すことができ、グローバル スコープの名前はその名前に値せず、オブジェクトが多数のメソッドを定義する必要がある場合は多数のグローバル関数を作成する必要があり、カスタム オブジェクト タイプにカプセル化特性がなくなります。

プロトタイプパターン

作成する各関数には、オブジェクトへのポインターである prototype プロパティがあります。このオブジェクトの目的は、特定の型のすべてのインスタンスで共有できるプロパティとメソッドを含めることです。つまり、prototype はコンストラクターによって作成されたオブジェクト インスタンスのプロトタイプ オブジェクトです。

関数 Person(){}
人.プロトタイプ.名前 = '123'
人物.プロトタイプ.年齢 = 18
Person.prototype.sayName = function() {
  console.log(この名前)
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.名前を言う() // 123
o2.名前を言う() // 123

利点: インスタンスがプロパティやイベントを共有する問題を解決します。 欠点: インスタンスはプロパティを共有するため、値が参照型であるプロパティの場合、1 つのインスタンスを変更すると、他のインスタンスがアクセスする値も変更されます。のように:

関数 Person(){}
人.プロトタイプ.名前 = '123'
人物.プロトタイプ.年齢 = 18
Person.prototype.friends = ['a', 'b']
Person.prototype.sayName = function() {
  console.log(この名前)
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.friends.push('c')
console.log(o2.friends) // ['a', 'b', 'c']

コンストラクタとプロトタイプパターンの組み合わせ

関数 Person(名前, 年齢) {
  this.name = 名前
  this.age = 年齢
  this.friends = ['a']
}
Person.プロトタイプ = {
  コンストラクタ: Person,
  sayName: 関数() {
    console.log(この名前)
  }
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.名前を言う() // 1
o2.名前を言う() // 2

利点: 各インスタンスは独自のプロパティを持ち、同時にメソッド参照を共有し、パラメータの受け渡しもサポートします。

ダイナミックプロトタイプパターン

関数 Person(名前, 年齢) {
  this.name = 名前
  this.age = 年齢
  this.friends = ['a']
  if(typeof this.sayName != 'function') {
    Person.prototype.sayName = function() {
      console.log(この名前)
    }
  }
}
var o1 = 新しいPerson(1,11)
var o2 = 新しいPerson(2,22)
o1.名前を言う() // 1
o2.名前を言う() // 2

利点: メソッドが存在しない場合に一度だけ作成し、繰り返しの作成を回避します。

寄生コンストラクタパターン

関数SpecialArray() {
  var o = 新しい配列()
  // 値を追加する o.push.apply(o, arguments)
  // メソッドを追加 o.toPipedString = function(){
    this.join('|') を返します
  }
  戻る
}
var o1 = 新しい特殊配列(1,11)
o1.toPipedString() // 1|11

利点: 元のコンストラクタを変更せずにオブジェクトに特別なメソッドを追加します。欠点: 返されるオブジェクトはコンストラクタやコンストラクタのプロトタイプと関係がなく、メソッドはコンストラクタの外部で作成されたオブジェクトと変わりません。

安全なコンストラクタパターン

関数 Person(名前) {
  var o = 新しいオブジェクト()
  // メソッドを追加 o.getName = function(){
    戻り名
  }
  戻る
}
var o1 = 新しいPerson(1)
o1.getName() // 1

寄生コンストラクタとは異なり、 this および new 呼び出しは使用されません。 利点: getName 以外に名前にアクセスする方法がないため、一部の安全な環境で使用できます。 欠点: ファクトリ パターンと同様に、オブジェクトの型を識別することはできません。

上記は、js でオブジェクトを作成するさまざまな方法の詳細内容と、その長所と短所の概要です。js でのオブジェクトの作成の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • js でオブジェクトとオブジェクト メソッドを作成するいくつかの方法の詳細な説明
  • JavaScriptオブジェクト指向オブジェクト作成方法のまとめ
  • JSで関数とオブジェクトを作成する方法
  • JavaScript オブジェクト作成方法のまとめ [ファクトリパターン、コンストラクターパターン、プロトタイプパターンなど]
  • JavaScript でオブジェクトを作成する一般的な方法の概要
  • JavaScript でカスタム オブジェクトを作成する一般的な方法の概要
  • JavaScript でオブジェクトを作成する 7 つの方法の包括的な概要
  • JS オブジェクトを作成するための一般的な方法と原則の分析
  • JavaScript でオブジェクトを作成する 7 つの方法 (推奨)
  • JS でオブジェクトを作成する 4 つの方法

<<:  Linux での MySQL 5.7.18 バイナリ パッケージのインストール チュートリアル (デフォルトの構成ファイル my_default.cnf なし)

>>:  Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する

推薦する

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

UbuntuにMySQLデータベースをインストールする方法

Ubuntu は、Linux をベースにした無料のオープンソース デスクトップ PC オペレーティン...

ポップアップ効果を実現するにはjsを使用します

この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...

Mysql 5.6.37 winx64 インストール デュアル バージョン mysql ノート

マシンに MySQL バージョン 5.0 がすでに存在する場合は、最新バージョンの MySQL のイ...

MySQL に大量のデータを挿入するときに重複データを除外する方法

目次1. 問題を発見する2.重複したデータを残さずにすべて削除する3. 削除テーブルから重複データを...

Web ページのスクロール バーが右側に設定されているのはなぜですか?

私たちが毎日使っているブラウザや Word 文書のスクロール バーはなぜ右側にあるのでしょうか。多く...

CSS でフロートをクリアするための完全ガイド (要約)

1. 親divは疑似クラスafterとzoomを定義します <スタイル タイプ="...

HTML 挿入画像の例 (HTML 追加画像)

HTML に画像を挿入するには、画像を表示するための HTML タグが必要です。これは、img タ...

VueでEchartsチャートの幅と高さの適応を実現する実践

目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...

JSはカード配布アニメーションを実現します

この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...

Linux で boost.python を使用して C++ 動的ライブラリを呼び出す方法

序文最近、C++ 動的ライブラリをテストするためにロボット フレームワークを使い始めました。ロボット...

MySQLカバーインデックスの詳しい説明

コンセプトインデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング イン...

MySQLのデフォルトのソートルールに基づく落とし穴

MySQL のデフォルトの varchar 型は大文字と小文字を区別しません (insensitiv...

Linux で libudev を使用して USB デバイスの VID と PID を取得する方法

この記事では、libudev ライブラリを使用して hidraw デバイスにアクセスします。 lib...