初期作成方法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 を使用して独自のプライベート レジストリ サーバーを構築する
ブラウザの互換性とは、スタイルの互換性 (CSS)、インタラクションの互換性 (JavaScript...
コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...
学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...
エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...
nginx Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー...
CSS を記述するときに、デザインに存在する重要なケースを忘れてしまうことがあります。たとえば、コン...
SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...
まず依存関係をインストールする必要があります npm i lib-flexible-computer...
この記事では、MySQL が乱数を生成し、文字列を連結する方法について例を使用して説明します。ご参考...
目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...
<br />表の境界線の CSS 構文具体的な内容には、上境界線の幅、右境界線の幅、下境...
方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...
Dockerコンテナを使用する場合は、nsenterツールを使用する方が便利です。システムにない場合...
要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...