0

基本的に私はこれをしたい:

someFunction() // do something

someFunction.somePropertyFunction()

someFunction()  // Now someFunction is modified; it should now exhibit a different behaviour

これは可能ですか?

編集:

@Kolinkが示唆していたことを探しているわけではありません。基本的に、関数のプロパティ関数の 1 つを呼び出して、関数の機能を拡張したいと考えています。

具体的には、次のことを行う必要があります: 1. プロパティ関数内の元の関数にアクセスし (これは を使用して完全に実行可能ですthis)、2. 新しい関数を元の関数の名前にバインドします (これが可能かどうかはわかりません)。

明確にするために、私は拡張したい関数の内部定義にアクセスできません。関数を Function.prototype にアタッチして (拡張する関数のプロパティとして使用できるようにするため)、func.augmentThis() を呼び出して、func拡張する必要があります。しかし、どのようにすればよいかわからないので、質問:P

4

6 に答える 6

1

簡単に。次に例を示します。

var derp = 123;
someFunction = function() {alert(derp);};
someFunction.somePropertyFunction = function() {derp = 456;};

someFunction(); // alerts 123
someFunction.somePropertyFunction();
someFunction(); // alerts 456

わかりました、それは単純化しすぎた例ですが、ええ、完全に可能です。

于 2013-07-12T07:45:08.977 に答える
0

並べ替え:

function someFunction() {
    return realFunction.apply(this, arguments);
}

function someFunctionA(name) {
    return 'Hello, ' + name + '!';
}

function someFunctionB(name) {
    return 'Goodbye, ' + name + '...';
}

var realFunction = someFunctionA;

someFunction.somePropertyFunction = function () {
    realFunction = someFunctionB;
};
于 2013-07-12T07:57:03.653 に答える
0

に機能を付けたいFunction.prototype。次に、新しい関数を元の関数の名前にバインドする必要があります (それが可能かどうかはわかりません)。

それは確かに不可能です。何が関数を参照しているのかわかりません。また、不変である関数の内部表現を変更することはできません。

あなたができる唯一のことは、新しい関数を作成してそれを返し、メソッドの呼び出し元が何らかの方法でそれを使用できるようにすることです-具体的には元の変数に割り当てます:

somefunction = somefunction.augmentSomehow();

そのためのメソッドは次のようになります。

Function.prototype.augmentSomehow = function() {
    var origFn = this;
    return function() {
        // in here, do something special
        // which might include invoking origFn() in a different way
    };
};
于 2013-07-12T08:57:55.077 に答える