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 を使用して独自のプライベート レジストリ サーバーを構築する

推薦する

Javascript を使用して、スライドバー効果のあるスライドナビゲーション プラグインを開発します。

目次1. はじめに2. 使用方法3. 開発プロセス1. モデル例2. イベントとアニメーション4. ...

Docker JVM メモリ使用量の表示

1. Docker コンテナのホスト マシンに入り、指定されたイメージを実行しているコンテナ ID ...

Ubuntu 20.04 では、隠し録音ノイズ低減機能が有効になります (推奨)

最近、 Ubuntu 20.04でkazamを使用して録音しているときに、問題が見つかりました。シス...

MySql のスロークエリ分析とスロークエリログの開き方の詳細説明

最近はMySQLのパフォーマンス最適化についても研究しているので、今日の投稿は勉強ノートとしても使え...

MySQL のインデックスにおける NULL の影響についての詳細な説明

序文私は多くのブログを読み、弊社の DBA を含む多くの人々が、MySql では列に null が含...

MySQLの水平および垂直テーブルパーティションの説明

前回の記事で、MySQL ステートメントの最適化には限界があると述べました。MySQL ステートメン...

Nginx イントラネット スタンドアロン リバース プロキシの実装

目次1 Nginxのインストール2 Nginxの設定3 ホストファイルを変更する4 テストNginx...

MySQL マルチテーブルクエリの具体例

1. SELECT句を使用して複数のテーブルをクエリするSELECT フィールド名 FROM tab...

Vueトップタグ閲覧履歴の実装

目次ナンセンス実装された機能文章要点ナンセンスデモプレビュー実装された機能デフォルトでホームページが...

バッチファイルを処理するLinuxの1行コマンドの詳細な説明

序文最良の方法は、あなたが思いつく最も速い方法ではないかもしれません。職場で一時的に使用するスクリプ...

mysql バッチで大量のデータを削除する

mysql バッチで大量のデータを削除する1000万件のレコードを持つテーブル(syslogs)があ...

MySQLデータベースのスケジュールバックアップを実装する方法

1. シェルスクリプトを作成する vim バックアップdb.sh 次のようにスクリプトを作成します。...

Vueのレスポンシブシステムの原理の詳細な説明

目次Vueのレスポンシブシステムの基本原則1. Object.definePropertyの使い方を...

MySQLデータベースが大きすぎる場合にバックアップと復元を行う方法

コマンド: mysqlhotcopyこのコマンドは、ファイルをコピーする前にテーブルをロックし、不完...

jQueryはショッピングカートの完全な機能を実現します

この記事では、ショッピングカートの完全な機能を実現するためのjQueryの具体的なコードを参考までに...