6

C#では、抽象メソッドと、これをJavascriptに適用する方法についての概念があります。例、私は例を持っています:

function BaseClass() {
    this.hello = function() {
        this.talk();
    }
    this.talk = function() {
        alert("I'm BaseClass");
    }
};

function MyClass() {
    this.talk = function() {
        alert("I'm MyClass");
    }
    BaseClass.call(this);
};

MyClass.prototype = new BaseClass();

var a = new MyClass();
a.hello();​

オブジェクトがMyClassのインスタンスである場合に、BaseClassの関数hello()がMyClassから関数do()を呼び出す方法。アラートの結果は「I'mMyClass」である必要があります。私を助けてください。ありがとう。

4

3 に答える 3

7

最初に「ベース」コンストラクターを呼び出すことができます。

function MyClass() {
    BaseClass.call(this);
    this.talk = function() {
        alert("I'm MyClass");
    }
}

それ以外の場合BaseClass.talkは上書きされますMyClass.talk

補足として、javascript で「クラス」の概念を使用することは、むしろ非生産的です。これは、この言語がどのように機能するかではないためです。JS はプロトタイプの継承を使用します。つまり、「クラス」からではなく、他のオブジェクトから新しいオブジェクトを派生させます。また、JS のすべての関数は、C++ の意味で「仮想」です。そのthisポインターは、関数が定義されている場所ではなく、関数の呼び出し方法に依存するためです。

于 2012-06-19T08:09:11.560 に答える
4

あなたはあなたの機能をオーバーライドしていますBaseClass.call(this);

function MyClass() {
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class
    this.talk = function() {
        alert("I'm MyClass");
    }
};

これにより、コードが機能します。MyClass.prototype = new BaseClass();オブジェクトで hello 関数を使用できるようにする必要がありますa

于 2012-06-19T08:09:25.870 に答える
4

MyClass問題は、コンストラクターとコンストラクターの両方で、実際にプライベート インスタンス メソッドを定義していることですBaseClasstalkメソッドはプロトタイプに配置されていませんが、実際のインスタンス プロパティであり、コンストラクターはコンストラクターのBaseClass呼び出されるため、プロパティが上書きされるため、これはプロトタイプ メソッドのルックアップをオーバーライドします。MyClasstalk

実際のプロトタイプ継承によるデモンストレーション。

于 2012-06-19T08:10:12.287 に答える