オブジェクト指向JavaScript(OOJS)オブジェクトインスタンスを作成する3つの方法
プログラミング言語が オブジェクトについて, 最初に学ぶ必要があるのは オブジェクトを作成する方法. JavaScriptでオブジェクトを作成するのはとても簡単です。 一対の中括弧 仕事はしますが、それはです 唯一の方法でもない オブジェクトを作成する また唯一の方法 あなたが使う必要があるでしょう.
JavaScriptでは、オブジェクトインスタンスは 組み込みオブジェクトから作成されたもの プログラムが実行されているときに存在するようになります。例えば, 日付
日付に関する情報を提供する組み込みオブジェクトです。現在の日付をページに表示したい場合は、 のランタイムインスタンスが必要 日付
それは現在の日付についての情報を運びます.
JavaScriptはまた私達を可能にします 自分のオブジェクトを定義する 実行時に独自のオブジェクトインスタンスを生成できます。 JavaScriptで, すべてがオブジェクトです そしてすべてのオブジェクトは 究極の先祖 呼ばれる 対象
. オブジェクトインスタンスの作成はと呼ばれます インスタンス化.
1. 新しい
オペレーター
新しいオブジェクトインスタンスを作成するための最も一般的でよく知られた方法の1つは、 を使用して 新しい
オペレーター.
あなたには必要だ コンストラクタ するために 新しい
オペレーターの仕事コンストラクタは、オブジェクトのメソッドです。 そのオブジェクトの新しいインスタンス. その基本的な構文は次のようになります。
新しいコンストラクタ()
コンストラクタは 引数を受け入れる それはそれが構築するオブジェクトインスタンスにプロパティを変更または追加するために使用することができます。コンストラクタ 同名 それが属するオブジェクトとして.
これを作成する方法の例です。 のインスタンス 日付()
物 とともに 新しい
キーワード:
dt =新しい日付(2017、0、1)console.log(dt)//日曜日2017年1月1日00:00:00 GMT + 0100
日付()
新しいを作成するためのコンストラクタです。 日付
オブジェクトオブジェクトに対するさまざまなコンストラクタ 異なる議論をする 同じ種類のオブジェクトインスタンスを作成するには さまざまな属性.
JavaScriptのすべての組み込みオブジェクトを次のようにインスタンス化できるわけではありません。 日付
. あるオブジェクトがあります コンストラクタは付属しません: 数学
, JSON
そして 反映する
, しかし、それらはまだ普通のオブジェクトです.
コンストラクタを持つ組み込みオブジェクトの中, シンボル
コンストラクタスタイルでは呼び出せない 新しいインスタンスを作成する シンボル
インスタンス。それだけです 関数として呼ばれる これは新しいを返します シンボル
値.
また、コンストラクターを持つ組み込みオブジェクトの中で、すべてのコンストラクターをそのコンストラクターで呼び出す必要はありません。 新しい
インスタンス化するための演算子. 関数
, アレイ
, エラー
, そして 正規表現
関数と呼ぶこともできます, 使用せずに 新しい
キーワードを入力すると、インスタンス化して新しいオブジェクトインスタンスを返します。.
2. 反映する
物
バックエンドプログラマはすでに精通しているかもしれません。 リフレクションAPI. リフレクションは、プログラミング言語の特徴です。 いくつかの基本的な実体を調べて更新する, オブジェクトやクラスなど, 実行時に.
JavaScriptでは、あなたはすでに実行することができます 一部 を使用した反射操作 対象
. しかし、 適切なReflection API 最終的にはJavaScriptにも存在するようになりました.
の 反映する
オブジェクトには一連のメソッドがあります。 オブジェクトインスタンスを作成および更新する. の 反映する
物 コンストラクタがありません, だからそれはインスタンス化することはできません 新しい
演算子、そして、ちょうど 数学
そして JSON
, それ 関数として呼び出すことはできません どちらか.
しかしながら, 反映する
持っています と同等 新しい
オペレーター: Reflect.construct()
方法.
Reflect.construct(target、argumentsList [、newTarget])
両方 ターゲット
そして任意 newTarget
引数は 独自のコンストラクタを持つオブジェクト, しながら argumentsList
です 引数のリスト のコンストラクタに渡される ターゲット
.
var dt = Reflect.construct(Date、[2017、0、1]); console.log(dt); //日曜日1月1日2017 00:00:00 GMT + 0100
上記のコード 同じ効果があります インスタンス化中 日付()
を使用して 新しい
オペレーター。まだ使えますが 新しい
, 反射は ECMAScript 6規格. それはまたあなたをすることができます を利用する newTarget
引数, これは、 新しい
オペレーター.
の価値 newTarget
のプロトタイプ(正確には、それはのプロトタイプです。 newTarget
のコンストラクタ) 新しく作成されたインスタンスのプロトタイプになります.
プロトタイプは オブジェクトのプロパティ, その値は またオブジェクト, 元のオブジェクトのプロパティを保持しています。つまり、オブジェクトはそのプロトタイプからメンバーを取得します。.
ここで、例を見てみましょう:
クラスA コンストラクタ()this.message = function()console.log( 'Aからのメッセージ')クラスB コンストラクタ() message()console.log( 'Bからのメッセージ) data()console.log( 'Bからのデータ') obj = Reflect.construct(A、[]、B)console.log(obj.message()); // console.log(obj.data())からのメッセージ。 // Bのデータconsole.log(Bのobjインスタンス)// true
渡して B
の3番目の引数として Reflect.construct()
, のプロトタイプ値 obj
オブジェクトは 同じにする のプロトタイプとして B
のコンストラクタ(プロパティを持ちます) メッセージ
そして データ
).
このように, obj
にアクセスできます メッセージ
そして データ
, そのプロトタイプで利用可能です。しかしそれ以来 obj
を使って作られている A
, それはまたそれ自身を持っています メッセージ
それ から受け取りました A
.
たとえ obj
配列として構築されている のインスタンスではありません アレイ
, そのプロトタイプは 対象
.
obj = Reflect.construct(Array、[1,2,3]、Object)console.log(obj)// Array [1、2、3] console.log(obj instanceof Array)// false
Reflect.construct()
オブジェクトを作成したいときに便利です。 複数の設計図を使用する.
3. Object.create()
方法
あなたも作成することができます 特定のプロトタイプを持つ新しい通常のオブジェクト 経由 Object.create()
. これもまた、 新しい
演算子、しかしそうではありません.
Object.create(O [、propertiesObject])
の ○
引数は、 プロトタイプを提供 作成される新しいオブジェクト用です。オプション propertiesObject
引数は プロパティのリスト 新しいオブジェクトに追加したいと思うかもしれません.
class A constructor() message()console.log( 'Aからのメッセージ) var obj = Object.create(new A()、data:writable:true、設定可能:true、value:) function()return 'objのデータを返す)console.log(obj.message())// Aのメッセージconsole.log(obj.data())// objのデータobj1 = Object.create( new A()、foo:書き込み可能:true、設定可能:true、値:function()return 'foo from obj1' console.log(obj1.message())//コンソールからのメッセージ。 log(obj1.foo())// obj1からのfoo
の中に obj
オブジェクト、追加されたプロパティは データ
, にいる間 obj1
, それは フー
. だから、あなたが見るように、私たちは持つことができます 新しいオブジェクトに追加されたプロパティとメソッド.
あなたが作りたいとき、これは素晴らしいです 同じ種類の複数のオブジェクト しかし 異なる補助的性質または方法. の Object.create()
構文はそれらすべてを別々にコーディングする手間を省きます。.