5

私は JavaScript を初めて使用するわけではありませんが、そのプロトタイプの継承について特定のことを理解することはできませんでした。

親と子の「クラス」(オブジェクトを作成する親と子の関数)があるとします。子を作成できるようにするには、まず次のことを行う必要があります

Child.prototype = new Parent();

ここで難点があります。プロトタイプを Child に割り当てることで、コード内で何も実行せず、そのプロパティを Children と共有するだけのもう 1 つのオブジェクト Parent を取得します。しかし、Parent のコンストラクターはまだ呼び出されています。たとえば、parent が特定の UI オブジェクトを表している場合、アプリケーションでは、実際には作成したくないオブジェクトがもう 1 つあります。もちろん、それは私たちのアプリケーションの状態に影響を与える可能性があり、影響を与えるでしょう.

これに対処する方法がわかりました: 特定の引数を Parent コンストラクターに渡して、作成しているオブジェクトがプロトタイプ用であり、一般的な使用用ではないことを示します。

RedButton.prototype = new Button(FOR_PROTO_ONLY);

次に、親コンストラクターで、表示可能なものを実行するかどうかを決定します。しかし、これは非常に醜い回避策です。

Java などのクラス指向言語では、継承は追加の関数の呼び出しを想定していないため、このような問題はまったくありません。プログラムでこのような醜い手法を使用せずに、見栄えの良いプロトタイプ階層を作成できるようにするにはどうすればよいでしょうか?

4

1 に答える 1

1

できることの 1 つは、親のインスタンスをコンストラクターのプロトタイプ プロパティに割り当てることです。これは、親の無関係なインスタンスを作成する必要がないことを意味するため、追加の GUI コンポーネントが定義される可能性があるという問題が軽減されます。ただし、これは、子のインスタンスをインスタンス化する前に、少なくとも 1 つの親のインスタンスが必要であることを意味します。したがって、これだけでも、非常に特定の状況での有用性が制限されます。

例を次に示します: http://jsfiddle.net/xwwWZ/

var Child = function() {

    this.throwATantrum = function() {

        alert("Waaaaaaaaaah");

    }
};


var Parent = function() {

    // Set the prototype here to avoid having to create an extra instance elsewhere.
    Parent.prototype = this;

    this.sayHello = function() {

        alert("Hello!");

    }
};


// We must, however, instantiate an instance of the parent before we can
// instantiate an instance of a child.
var p = new Parent();


Child.prototype = Parent.prototype;

var c = new Child();

c.throwATantrum();
c.sayHello();
于 2012-08-25T21:23:29.007 に答える