1

jquery extend を使用して継承をシミュレートしようとしていますが、テストできる限り、オブジェクトでのみ機能します。

私が達成しようとしているのは次のとおりです。

var baseDefinition = function() {
    var self = this;

    self.calc1 =  function() {
        return "something1";
    }

    self.calc2 =  function() {
        return "something2";
    } 

    self.myObject = {
        propA = 100;
        propB = 200;
    };
}

var derivedDefinition = function() {
    var self = this;

    self.calc2 =  function() {
        return "something different from base";
    }

    self.myObject = {
        propB  = 400;
    };            
}

var instance = $.extend(true, {}, baseDefinition, derivedDefinition);

したがって、派生定義が基本定義に適用されるが、どちらの定義も「変更」されない基本定義から新しいインスタンスを作成したいと考えています。出来ますか?

私はプロトタイプを避けることを望んでいたので、基本的には上書きされたかどうかを知らずに instance.calc1 または instance.calc2 を呼び出したいと思います。

編集:

私の例では、jquery の拡張機能を使用するようになったオブジェクト プロパティを含めませんでした。どちらの答えも内部関数の「継承」を解決しますが、extend のようにオブジェクト プロパティを (明らかに) マージしません。可能な解決策として、インスタンスを作成した後、インスタンスのプロパティをループしてjqueryの拡張を適用することを考えています。これは私には効率が悪いように思えますが、別の方法についてアドバイスをいただけないでしょうか。

4

2 に答える 2

1

$.extend(遠い?) 将来オブジェクトをインスタンス化する関数ではなく、既存のオブジェクトでのみ機能します。

var instance = $.extend(true, {}, new baseDefinition(), new derivedDefinition());

ただし、もちろんextend、コンストラクターに対して機能し、関数を返す関数を設計することもできます。

function extendConstr() {
    var fns = arguments;
    return function newConstr(){
        var self = {};
        for (var i=0; i<fns.length; i++)
            fns[i].apply(self, arguments);
        return self;
    }
}

var extendedFunction = extendConstr(baseDefinition, derivedDefinition);

var instance = extendedFunction();
console.log(instance); // has `calc1` and overwritten `calc2`

ところで、extend派生コンストラクターで既に手動で実行できたはずの関数がなければ、次のようになります。

function derivedDefinition() {
    baseDefinition.call(this/*, arguments */);

    this.calc2 =  function() {
        return "something different from base";
    }
}
console.log(new derivedDefinition) // has a `calc1` as well
于 2013-07-30T22:55:44.527 に答える