1

このブログページで詳しく説明されているように、JavaScript の天才 John Resig の「シンプルな JavaScript 継承」を試してみることにしました。

http://ejohn.org/blog/simple-javascript-inheritance/

スーパーメソッドを呼び出すコードでメソッドをオーバーライドする方法に興味があります。つまり、 Personクラスから始めるとしましょう:

var Person = Class.extend({
    init: function ( name, age ) {
        this.name = name;
        this.age = age;
    }
});

そのPersonクラスを拡張して、新しいクラスWorkerを作成します。

var Worker = Person.extend({
    init: function ( name, age, occupation ) {
        this.name = name;
        this.age = age;
        this.occupation = occupation;
    }
});

initメソッドの 2 つのバージョンでコードの繰り返しがあります。次の 2 行は、使用しているクラスに関係なく実行されます。

this.name = name;
this.age = age;

Heroクラスのinitメソッド内からPersonクラスのinitメソッドを呼び出してから、 ocseプロパティを含む追加のコード行を挿入できるようにすべきだと思われます。

しかし、Resig 氏のコードではそれができません。以下は機能しません。

var Worker = Person.extend({
    init: function ( name, age, occupation ) {
        this._super(arguments);
        this.occupation = occupation;
    }
});

Workerクラスを作成するためにPersonから呼び出されたextendメソッドが *this._super(arguments)*を確認するとすぐに、 Worker のinit全体をPerson のinitに置き換え、未定義の職業プロパティを残します。

Resig氏のコードを変更せずにこれを回避する方法について何か提案はありますか? 現在、「スーパー」の概念を実装するさまざまな方法を試していますが、これを既存のコードで機能させることができないという事実が頭に浮かびます。:-)

更新: Resig 氏のコードを実装する際に 1 つの小さなエラーを犯したことに気付きました。これが、説明した方法で動作した理由です。@chuckj もWorker の initのエラーを正しく指摘しました。

4

2 に答える 2

5

ワーカー定義を次のように変更します。

var Worker = Person.extend({ 
    init: function (name, age, occupation) { 
        this._super(name, age); 
        this.occupation = occupation; 
    } 
}); 

arguments配列を渡さず、_super期待するパラメーターを指定して を呼び出します。

于 2012-02-04T22:23:46.083 に答える
0

あなたの目標は to をプロキシするargumentsことthis._superです。この場合、apply()それらだけにすることができます:

var Worker = Person.extend({
    init: function ( name, age, occupation ) {
        this._super.apply(this, arguments);
        this.occupation = occupation;
    }
});
于 2013-01-30T15:33:33.233 に答える