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

推薦する

Vueはプログレスバーの変更効果を実現します

この記事ではVueを使ってプログレスバーの変更を簡単に実装してみましたので参考にしてください。具体的...

Linuxのテキスト処理コマンドsortの詳細な説明

テキストファイルの内容を並べ替える使用方法: ソート + オプション + ファイル名 (複数のファイ...

Vue が配列の変更を監視できない問題の解決方法

目次1. Vueリスナー配列2. vueが配列の変更を監視できない状況1. Vueリスナー配列Vue...

k8sとDockerの関係についての簡単な説明

最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...

JavaScript の例におけるループの使用法の詳細な説明

退屈だったので、ループに関する簡単な演習をいくつかまとめてみました。JS を学び始めたばかりの方に役...

6秒でMySQLに100万件のレコードを挿入する方法を教えます

1. アイデアMySQL に 1,000,000 件のレコードを挿入するのにたった 6 秒しかかかり...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

MySQL binlog の解析

目次1. binlogの紹介2. Binlog関連のパラメータ3. バイナリログの内容を分析するIV...

MySQLからElasticsearchにデータを同期する方法の詳細な説明

目次1. 同期の原理2. ログスタッシュ入力JDBC 3. go-mysql-elasticsear...

JavaScript のクロージャの詳細な説明

導入クロージャは JavaScript の非常に強力な機能です。いわゆるクロージャは関数内の関数です...

CSSは、閉じることができるマスクレイヤーを備えたポップアップウィンドウ効果を実装します。

実際の開発ではポップアップウィンドウがよく使われます。CSS3を勉強していたときに、閉じることができ...

HTML 5 プレビュー

<br />オリジナル: http://www.alistapart.com/artic...

Dockerイメージを素早くデプロイして実行する最新のIDEAプロセスの詳細な説明

背景docker とアイデアを使用して、Java Web の開発、展開、運用までのプロセス全体を実現...

CSS3 を使用して楕円軌道の回転を実装するサンプルコード

最近、次のような効果を達成する必要がある最初は、CSS3D回転を使用して記述すると、次の効果しか得ら...