JavaScriptでオブジェクトを作成する方法のまとめ(超定番)
この記事は、JavaScript でオブジェクトを作成する方法をまとめたものです。必要な方は参考にしていただければ幸いです。
JavaScript でオブジェクトを作成する方法はたくさんあります。オブジェクト コンストラクターまたはオブジェクト リテラルを使用して単一のオブジェクトを作成することもできます。明らかに、これら 2 つの方法では大量の繰り返しコードが生成されるため、大量生産には適していません。次に、オブジェクトを作成するための 7 つの非常に古典的な方法を紹介します。それぞれに独自の長所と短所があります。 (内容は主に「JavaScript Advanced Programming」からのもので、他の人が書いた記事も参照しています)
1. ファクトリモード
function createPerson(name, job) { var o = new Object() ; o.name = name ; o.job = job ; o.sayName = function() { console.log(this.name) } return o } var person1 = createPerson('Mike', 'student') var person2 = createPerson('X', 'engineer')
このファクトリ関数は何度でも呼び出すことができ、毎回次の内容を含む関数が返されます。 2 つの属性とメソッド オブジェクト。
ファクトリ パターンは、類似したオブジェクトを複数作成するという問題は解決しますが、オブジェクトの識別の問題は解決しません。つまり、オブジェクトの種類を知ることができません。
2. コンストラクターモード
function Person(name, job) { this.name = name ; this.job = job ; this.sayName = function() { console.log(this.name) } } var person1 = new Person('Mike', 'student') var person2 = new Person('X', 'engineer')
このコンストラクターを呼び出すには new を使用します。
① 新しいオブジェクトを作成します。
② スコープを変更します。コンストラクター 新しいオブジェクトに代入します (つまり、これは新しいオブジェクトを指します);
③コンストラクター内のコードを実行します (新しいオブジェクトに属性を追加します);
④新しいオブジェクトを返します。
欠点: 各インスタンスで各メソッドを再作成する必要があります。
同じタスクを完了する 2 つの Function インスタンスを作成する必要はありません。さらに、このオブジェクトを使用すると、コードを実行する前に関数を特定のオブジェクトにバインドする必要がなく、次の形式で定義できます。
function Person( name, age, job ){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert( this.name ); }
このようにして、sayName() 関数の定義を に転送できます。外部コンストラクター。コンストラクター内で、sayName プロパティをグローバルのsayName 関数に設定します。この場合、sayName には関数へのポインタが含まれるため、person1 オブジェクトと person2 オブジェクトは、グローバル スコープで定義された同じ SayName() 関数を共有できます。
これにより、同じことを行う 2 つの関数の問題は解決されましたが、新しい問題が発生します。グローバル スコープで定義された関数は、実際には特定のオブジェクトによってのみ呼び出すことができるため、グローバル スコープはその名前に少しふさわしくないものになります。さらに重要なことは、オブジェクトで多くのメソッドを定義する必要がある場合、多くのグローバル関数を定義する必要があることです。このように、カスタマイズされた参照型にはカプセル化がまったくありません。
これらの問題は、プロトタイプ モードを使用することで解決できます。
3. プロトタイプモード
function Person() { } Person.prototype.name = 'Mike' Person.prototype.job = 'student' Person.prototype.sayName = function() { console.log(this.name) } var person1 = new Person()
プロトタイプオブジェクトに情報を直接追加します。プロトタイプを使用する利点は、すべてのインスタンス オブジェクトがそれに含まれるプロパティとメソッドを共有できることです。コンストラクターでオブジェクト インスタンス情報を定義する代わりに、この情報をプロトタイプ オブジェクトに直接追加できます。
①プロトタイプを理解する
新しい関数が作成されるたびに、特定のルールに従ってその関数のプロトタイプ属性が作成されます。
デフォルトでは、すべての prototype 属性は、prototype 属性が配置されている関数へのポインターを含む constructor (コンストラクター) 属性を自動的に取得します。
コードがオブジェクトのプロパティを読み取るたびに、指定された名前のプロパティをターゲットとして検索が実行されます。検索はオブジェクト インスタンス自体から始まります。指定された名前の属性がインスタンス内で見つかった場合は、その属性の値が返されます。見つからなかった場合は、ポインタが指すプロトタイプ オブジェクトが検索され、指定された名前の属性がプロトタイプ オブジェクト内で見つかります。このプロパティがプロトタイプ オブジェクトで見つかった場合、このプロパティの値が返されます。
プロトタイプに保存されている値にはオブジェクト インスタンスを通じてアクセスできますが、プロトタイプ内の値をオブジェクト インスタンスを通じてオーバーライドすることはできません。
インスタンスにプロパティを追加し、そのプロパティがインスタンス内のプロパティと同じ名前である場合、そのプロパティはインスタンス内に作成され、そのプロパティはプロトタイプ内のそのプロパティをマスクします。
属性をnullに設定しても、インスタンス内でのみ属性値がnullになります。
ただし、インスタンスのプロパティは削除演算子を使用して完全に削除でき、プロトタイプ内のプロパティに再度アクセスできるようになります。
hasOwnProperty() メソッドを使用して、プロパティがインスタンスに存在するかプロトタイプに存在するかを検出します。このメソッドは、指定されたプロパティがオブジェクト インスタンスに存在する場合にのみ true を返します。
in 演算子は、プロパティがインスタンスに存在するかプロトタイプに存在するかに関係なく、オブジェクトを通じて特定のプロパティにアクセスできる場合に true を返します。
function Person(){ } Person.prototype = { name : "Mike", age : 29, job : "engineer", syaName : function(){ alert( this.name ); } };
4. コンストラクターパターンとプロトタイプパターンの併用
组合使用构造函数模式和原型模式是使用最为广泛、认同度最高的一种创建自定义类型的方法。它可以解决上面那些模式的缺点,使用此模式可以让每个实例都会有自己的一份实例属性副本,但同时又共享着对方法的引用,这样的话,即使实例属性修改引用类型的值,也不会影响其他实例的属性值了。还支持向构造函数传递参数,可谓是集两种模式的优点。
function Person(name) { this.name = name this.friends = ['Jack', 'Merry'] } Person.prototype.sayName = function() { console.log(this.name) } var person1 = new Person() var person2 = new Person() person1.friends.push('Van') console.log(person1.friends) //["Jack", "Merry", "Van"] console.log(person2.friends) // ["Jack", "Merry"] console.log(person1.friends === person2.friends) //false
五、动态原型模式
动态原型模式将所有信息都封装在了构造函数中,初始化的时候。可以通过检测某个应该存在的方法是否有效,来决定是否需要初始化原型。
function Person(name, job) { // 属性 this.name = name this.job = job // 方法 if(typeof this.sayName !== 'function') { Person.prototype.sayName = function() { console.log(this.name) } } } var person1 = new Person('Mike', 'Student') person1.sayName()
只有在sayName方法不存在的时候,才会将它添加到原型中。这段代码只会初次调用构造函数的时候才会执行。此后原型已经完成初始化,不需要在做什么修改了,这里对原型所做的修改,能够立即在所有实例中得到反映。
其次,if语句检查的可以是初始化之后应该存在的任何属性或方法,所以不必用一大堆的if语句检查每一个属性和方法,只要检查一个就行。
六、寄生构造函数模式
这种模式的基本思想就是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新建的对象
function Person(name, job) { var o = new Object() o.name = name o.job = job o.sayName = function() { console.log(this.name) } return o } var person1 = new Person('Mike', 'student') person1.sayName()
这个模式,除了使用new操作符并把使用的包装函数叫做构造函数之外,和工厂模式几乎一样。
构造函数如果不返回对象,默认也会返回一个新的对象,通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。
七、稳妥构造函数模式
首先明白稳妥对象指的是没有公共属性,而且其方法也不引用this。稳妥对象最适合在一些安全环境中(这些环境会禁止使用this和new),或防止数据被其他应用程序改动时使用。
稳妥构造函数模式和寄生模式类似,有两点不同:1.是创建对象的实例方法不引用this;2.不使用new操作符调用构造函数
function Person(name, job) { var o = new Object() o.name = name o.job = job o.sayName = function() { console.log(name) } return o } var person1 = Person('Mike', 'student') person1.sayName()
和寄生构造函数模式一样,这样创建出来的对象与构造函数之间没有什么关系,instanceof操作符对他们没有意义
相关推荐:
以上がJavaScriptでオブジェクトを作成する方法のまとめ(超定番)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









解決策: 1. スペルとパスを確認する; 2. コンポーネントへの参照を追加する; 3. レジストリを確認する; 4. 管理者として実行する; 5. Office を更新または修復する; 6. セキュリティ ソフトウェアを確認する; 7. 他のバージョンのコンポーネントを使用する; 8. 表示するエラー メッセージ; 9. 他の解決策を見つけます。詳細な紹介: 1. スペルとパスを確認します: オブジェクトの名前とパスにスペル エラーがないこと、およびファイルが指定されたパスに存在することを確認します; 2. コンポーネントへの参照を追加します。

JS と Baidu Map を使用してマップ パン機能を実装する方法 Baidu Map は広く使用されている地図サービス プラットフォームで、Web 開発で地理情報、位置情報、その他の機能を表示するためによく使用されます。この記事では、JS と Baidu Map API を使用してマップ パン機能を実装する方法と、具体的なコード例を紹介します。 1. 準備 Baidu Map API を使用する前に、Baidu Map Open Platform (http://lbsyun.baidu.com/) で開発者アカウントを申請し、アプリケーションを作成する必要があります。作成完了

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

株式分析に必須のツール: PHP および JS でローソク足チャートを描画する手順を学びます。特定のコード例が必要です。インターネットとテクノロジーの急速な発展に伴い、株式取引は多くの投資家にとって重要な方法の 1 つになりました。株価分析は投資家の意思決定の重要な部分であり、ローソク足チャートはテクニカル分析で広く使用されています。 PHP と JS を使用してローソク足チャートを描画する方法を学ぶと、投資家がより適切な意思決定を行うのに役立つ、より直感的な情報が得られます。ローソク足チャートとは、株価をローソク足の形で表示するテクニカルチャートです。株価を示しています

PHP と JS を使用して株のローソク足チャートを作成する方法。株のローソク足チャートは、株式市場で一般的なテクニカル分析グラフィックです。始値、終値、最高値、株価などのデータを描画することで、投資家が株式をより直観的に理解するのに役立ちます。株価の最低価格、価格変動。この記事では、PHP と JS を使用して株価のローソク足チャートを作成する方法を、具体的なコード例とともに説明します。 1. 準備 開始する前に、次の環境を準備する必要があります。 1. PHP を実行するサーバー 2. HTML5 および Canvas をサポートするブラウザー 3

JS と Baidu Maps を使用してマップ ヒート マップ機能を実装する方法 はじめに: インターネットとモバイル デバイスの急速な発展に伴い、マップは一般的なアプリケーション シナリオになりました。視覚的な表示方法として、ヒート マップはデータの分布をより直観的に理解するのに役立ちます。この記事では、JS と Baidu Map API を使用してマップ ヒート マップ機能を実装する方法と、具体的なコード例を紹介します。準備作業: 開始する前に、次の項目を準備する必要があります: Baidu 開発者アカウント、アプリケーションの作成、対応する AP の取得

JS と Baidu Maps を使用してマップ クリック イベント処理を実装する方法の概要: Web 開発では、地理的位置と地理情報を表示するためにマップ関数を使用することが必要になることがよくあります。マップ上のクリック イベント処理は、マップ機能の一般的に使用される重要な部分です。この記事では、JS と Baidu Map API を使用して地図のクリック イベント処理機能を実装する方法と、具体的なコード例を紹介します。手順: Baidu Map の API ファイルをインポートします。まず、Baidu Map API のファイルを HTML ファイルにインポートします。これは、次のコードによって実現できます。

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した
