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

推薦する

一般的なブラウザ互換性の問題(概要)

ブラウザの互換性とは、スタイルの互換性 (CSS)、インタラクションの互換性 (JavaScript...

Enterキーを押すとフォームが自動的に送信されます。予期せぬ発見

コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...

Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...

WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する

エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...

Nginx キャッシュ ファイルと動的ファイルの自動バランス設定スクリプト

nginx Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー...

CSS でコンテンツが長すぎる問題を解決する方法の詳細な説明

CSS を記述するときに、デザインに存在する重要なケースを忘れてしまうことがあります。たとえば、コン...

Linux suse11でルートパスワードを忘れた場合に変更する方法の簡単な分析

SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...

Vue3.0 異なる解像度のコンピュータの適応操作

まず依存関係をインストールする必要があります npm i lib-flexible-computer...

MySQL で乱数を生成し、文字列を連結する方法の例

この記事では、MySQL が乱数を生成し、文字列を連結する方法について例を使用して説明します。ご参考...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

表の境界線の CSS 構文

<br />表の境界線の CSS 構文具体的な内容には、上境界線の幅、右境界線の幅、下境...

MySQL ルートパスワードを変更する複数の方法 (推奨)

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

Dockerはコンテナに入るためにnsenterツールを使用する

Dockerコンテナを使用する場合は、nsenterツールを使用する方が便利です。システムにない場合...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

div 内の img と span の垂直方向の中央揃えの問題について

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...