2

JavaScript で継承をシミュレートするには、次の方法を見てください。これは非常に単純で、プロトタイプをまったく使用しません。うまく機能しているように見えますが、通常はこのようにしない人がいるという理由だけで、何か問題があるのではないかと思います。このアプローチの欠点と私が欠けているものは何ですか? どうもありがとう。

// The base class constructor
function Animal(name)
{
    var _name = name; // local variable, not visible to subclass

    this.greeting = function()
    {
        return "Hello, "+_name;
    }

    this.makeSound = function()
    {
        return "Don't know what to say";
    }
}

// The subclass constructor
function Cow(name)
{
    Animal.call(this, name); // call the base constructor

    this.makeSound = function()  // override base class's method
    {
        return "Mooooo!";
    }
}

var myCow = new Cow("Burenka");

console.log(myCow.greeting());  // call inherited method
console.log(myCow.makeSound()); // call overriden method

更新 回答とコメントをくれたみんなに感謝します。要約すると:

このアプローチを使用できますが、いくつかの制限があります。

  • すべてのインスタンスの構築は、プロトタイプへのリンクを設定するだけでなく、ゼロから実行されます。これはパフォーマンスに影響を与える可能性があります。
  • すべてのインスタンスには、すべての基本クラスのメソッドの定義が含まれており、メモリが浪費されています。
  • instanceof正しく動作しません (つまり、サブクラスのインスタンスを基本クラスのインスタンスとして扱いません)。
  • この方法でメソッドをオーバーライドすると、必要なときに基本クラスから実装を呼び出すことができなくなります (機能を拡張するだけで、完全に置き換える必要はありません)。
  • 基本クラスのメソッドの実装を動的に変更したい場合は、プロトタイプが必要です。

そしてもちろん、ここには同じ主題に関する他の質問があります。以下も参照してください。

4

1 に答える 1

1

この回答で説明されているプロトタイプでメソッドを定義する利点に加えて、メソッドではのインスタンスは のインスタンスでCowはないAnimalため、 を使用できませんinstanceof。プロトタイプmyCow instanceof Animalを使用した継承により、 true.

于 2013-09-17T21:06:21.413 に答える