0

だから私はいくつかのJavaScript継承技術をいじり回してきました、そしてこれは私が強力な解決策を導き出そうとしている1つのケースです。

簡単な例を次に示します。http: //jsfiddle.net/JgrYu/

問題:論理的には、2つのdivが両方とも0であると予想されます。ただし、拡張クラスを新しくしただけなので、「c」変数を再生成しません。

これに対する潜在的な修正は、機能継承を使用することです:http: //jsfiddle.net/h8xtz/

function mybase() {
    var that = {};
    var c = 0;

    that.hi = function() {
        var ele = $('<div></div>');
        ele.html(c++);
        $('body').append(ele);
    }

    return that;
}

function myextended() {
    var that = mybase();

    that.hi();

    return that;
}

myextended.prototype = new mybase();

$(document).ready(function() {
    var a = myextended();
    var b = myextended();
})​

ただし、これに関する問題は、グローバル名前空間が乱雑になり、実際にはプライベート変数の複製が必要な場合に、各オブジェクトが機能プロパティを複製することです。

したがって、私が探しているのは、この問題を解決するための機能継承よりも優れたアプローチです。プライベート変数とパブリック変数/関数を分離する疑似古典的継承構造を作成することを考えましたが、機能継承よりもオーバーヘッドが少ないバージョンを思い付くことができませんでした。

4

2 に答える 2

1

オブジェクトごとにプライベート変数の新しいセットを作成する場合は、子のコンストラクターから親のコンストラクターを呼び出す必要があります。また、親のインスタンスを子のプロトタイプオブジェクトとして使用するのではなく、親のプロトタイプオブジェクトから継承するオブジェクトのみを使用します。これは次の方法で実行できますObject.create

function myextended() {
    mybase.call(this); // apply the parent's constructor on the new object
    this.hi();
}

myextended.prototype = Object.create(mybase.prototype);

デモ

于 2012-09-10T16:49:51.627 に答える
0

変数をプロトタイプの一部にするのはどうですか?

function mybase() {

    this.hi = function() {
        var ele = $('<div></div>');
        ele.html(this.c++);
        $('body').append(ele);
    }
}

mybase.prototype.c = 0;

これが更新されたフィドルです。

this.c注:または、mybaseを宣言するときに初期化することもできます。

于 2012-09-10T16:48:52.340 に答える