今回はjsのnew()がコンストラクタの戻り値を変更する仕組みとそのポイントを紹介します。実際のケースですので、見てみましょう。
はじめに
他の高級言語と同様に、JavaScript にも new 演算子がクラスをインスタンス化し、メモリ内にインスタンス オブジェクトを割り当てるために使用されることがわかっています。 しかし、JavaScript ではすべてがオブジェクトです。なぜオブジェクトを生成するために new を使用する必要があるのでしょうか? この記事では、JavaScript の new の謎を探ります...
Person の新しいインスタンスを作成するには、new 演算子を使用する必要があります。
この方法でコンストラクターを呼び出すには、実際には次の 4 つの手順を実行します:
(1) 新しいオブジェクトを作成します。
(2) コンストラクターのスコープを新しいオブジェクトに割り当てます (つまり、これは This new を指します)。 object);
(3) コンストラクターでコードを実行します (この新しいオブジェクトにプロパティを追加します);
(4) 新しいオブジェクトを返します。
新しい演算子
上記の基本概念を紹介し、新しい演算子を追加すると、JavaScript では、オブジェクトを作成するための従来のオブジェクト指向クラス + 新しいメソッドが完成します。このアプローチはと呼ばれます。疑似古典的。
上記の例に基づいて、次のコードを実行します
var obj = new Base();
このコードの結果は何ですか? Javascript エンジンで表示されるオブジェクト モデルは次のとおりです:
new 演算子は実際に何をするのでしょうか?非常に簡単で、たった 3 つのことを実行しただけです。
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
最初の行では、空のオブジェクト obj を作成します
2 行目では、この空のオブジェクトの __proto__ メンバーを Base 関数オブジェクトのプロトタイプ メンバー オブジェクトにポイントします
3 行目では、Base 関数をポイントしますオブジェクトの __proto__ メンバー this ポインターを obj に置き換えて Base 関数を呼び出します。このため、呼び出し関数の使用法に関して、このメンバー変数の値は「base」になります。
Base.prototype オブジェクトにいくつかの関数を追加すると、どのような効果が得られますか?
たとえば、コードは次のとおりです:
Base.prototype.toString = function() { return this.id; }
そして、newを使用して新しいオブジェクトを作成すると、__proto__の特性に従って、新しいオブジェクトのメソッドとしてtoStringメソッドにアクセスすることもできます。
コンストラクターでは、「クラス」のメンバー変数 (例: この例では id) を設定し、コンストラクター オブジェクトのプロトタイプでは、「クラス」のパブリック メソッドを設定します。したがって、クラスとクラスのインスタンス化の効果は、関数オブジェクト、JavaScript 固有の __proto__ およびプロトタイプ メンバー、および new 演算子を通じてシミュレートされます。
この記事の事例を読んだ後は、その方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
以上がjs の new() はコンストラクターの戻り値とこのポインターをどのように変更しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。