ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript から借用したコンストラクターの分析 (例付き)

JavaScript から借用したコンストラクターの分析 (例付き)

不言
不言転載
2018-10-23 15:49:062629ブラウズ

この記事の内容は JavaScript 借用コンストラクターの分析に関するものです (サンプル付き)。必要な方は参考にしていただければ幸いです。

コンストラクターの借用

プロトタイプに参照型の値を含めることによって発生する問題を解決するために、開発者はコンストラクターの盗用と呼ばれる手法を使い始めました。

偽のオブジェクトまたは古典的な継承と呼ばれることもあります。

この手法の基本的な考え方は非常に単純です。つまり、サブタイプ コンストラクター内でスーパータイプ コンストラクターを呼び出すということです。

関数は、特定の環境でコードを実行するオブジェクトにすぎないため、apply() メソッドと call() メソッドを使用して、新しく作成されたオブジェクトに対してコンストラクターを実行することもできます。

function SuperType() {
    this.colors = ["red","blue","green"];
}

function SubType() {
    //继承了SuperType
    SuperType.call(this);
}

var instance1 = new SubType();

instance1.colors.push("black");
console.log(instance1.colors); //["red","blue","green","black"]

var instance2 = new SubType();
console.log(instance2.colors); //["red","blue","green"]

このコード部分は、スーパータイプのコンストラクターを「秒」実行することに注意してください。

function SubType() {
    //继承了SuperType
    SuperType.call(this);
}

call() メソッド (または apply() メソッドも) を使用すると、作成される SubType インスタンス オブジェクトのコンテキストで SuperType コンストラクターが実際に呼び出されます。

このようにして、SuperType() 関数で定義されたすべてのオブジェクト初期化コードが新しい SubType オブジェクトに対して実行されます。

したがって、SubType の各インスタンス オブジェクトには、colors プロパティの独自のコピーがあります。

パラメータの受け渡し

プロトタイプとの相対チェーンの場合、コンストラクターを借用する大きな利点は、サブタイプ コンストラクター内のスーパータイプ コンストラクターにパラメーターを渡せることです。上記のコードの

function SuperType(name) {
    this.name = name;
}

function SubType(){
    //继承了SuperType,同时还传递了参数
    SuperType.call(this, "Shaw");

    //实例属性
    this.age = 18;
}

var instance = new SubType();

console.log(instance.name); // "Shaw"
console.log(instance.age); // 18

SuperType は、属性に直接割り当てられるパラメーター名を 1 つだけ受け入れます。

SuperType コンストラクターが SubType コンストラクター内で呼び出されると、実際には、SubType インスタンス オブジェクトの name 属性が設定されます (このポインターは実行コンテキストに関連します)。

SuperType コンストラクターがサブタイプのプロパティをオーバーライドしないようにするために、スーパータイプのコンストラクターを呼び出した後に、サブタイプで定義する必要があるプロパティを追加できます。

コンストラクターを借用する問題

コンストラクターを借用するだけでは、コンストラクター パターンの問題を回避できません。

メソッドはすべてコンストラクターで定義されており、関数を再利用する方法はありません。オブジェクトがインスタンス化されるたびに、メソッドは基本的に各インスタンス オブジェクト上で再作成されるため、メモリとリソースが失われます。 。 無駄。

さらに、スーパータイプのプロトタイプで定義されたメソッドもサブタイプには見えません (ここではプロトタイプ オブジェクトが使用されておらず、サブタイプのプロトタイプ チェーンが実際には Object を指しているため)。コンストラクター パターンのみを使用できます。

これらの問題を考慮すると、コンストラクターを借用する手法が単独で使用されることはほとんどありません。

以上がJavaScript から借用したコンストラクターの分析 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。