初期作成方法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 判断) コンストラクタパターンの最適化関数 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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Linux での MySQL 5.7.18 バイナリ パッケージのインストール チュートリアル (デフォルトの構成ファイル my_default.cnf なし)
>>: Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する
1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...
この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...
Ubuntu は、Linux をベースにした無料のオープンソース デスクトップ PC オペレーティン...
この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...
マシンに MySQL バージョン 5.0 がすでに存在する場合は、最新バージョンの MySQL のイ...
目次1. 問題を発見する2.重複したデータを残さずにすべて削除する3. 削除テーブルから重複データを...
私たちが毎日使っているブラウザや Word 文書のスクロール バーはなぜ右側にあるのでしょうか。多く...
1. 親divは疑似クラスafterとzoomを定義します <スタイル タイプ="...
HTML に画像を挿入するには、画像を表示するための HTML タグが必要です。これは、img タ...
目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...
この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...
序文最近、C++ 動的ライブラリをテストするためにロボット フレームワークを使い始めました。ロボット...
コンセプトインデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング イン...
MySQL のデフォルトの varchar 型は大文字と小文字を区別しません (insensitiv...
この記事では、libudev ライブラリを使用して hidraw デバイスにアクセスします。 lib...