3

機能を無効にするややハッキーな方法として、私は次のようなJavaScriptを使用するというアイデアを思いつきました。

//fakefrob.js
var frob = function () {
    return {
        myFunc: function(){},
        myFunc1: function(){},
        myFunc2: function(){return 2;},
        myFunc3: function(){},
        myFunc4: function(){}
    };
}();

この例では、実際のフロブにこれらの関数の実装があります。明らかにこれはハックです(関数はほとんど何もしないか、プレースホルダーの戻り値を持っています)。foob​​arをrealfrob.jsに追加する場合、foobarの空の実装をfakefrob.jsに追加する必要があります。実際にfoobarをfakefrob.jsに追加せずに、frob.foobarfoobarがとして定義されたように動作するように(理想的にはライブラリを使用せずに)fakefrob.jsを作成する方法はありますか?function(){};

4

2 に答える 2

7

実際にfoobarをfakefrob.jsに追加せずに、frob.foobarfoobarがとして定義されたように動作するように(理想的にはライブラリを使用せずに)fakefrob.jsを作成する方法はありますか?function(){};

つまり、no-op関数にマップされたキャッチオールプロパティですか?いいえ、JavaScriptには(現在)キャッチオールプロパティがまったくありません。(ある段階でパイクを降りてくるプロキシの一部として、それらのメカニズムが検討されていると思います。)

frobただし、コード内の実際にアクセスできる場合は、fakefrob完全に自動的に生成できます。

// Assumes `frob` already exists
(function() {
    var mock;
    var name;

    // Build the mock, with a function for each function
    // on the real object.
    mock = {};
    for (name in frob) {
        if (typeof frob[name] === "function") {
            mock[name] = function() { };
        }
    }

    // Replace the original    
    frob = mock;
})();

そしてもちろん、非関数プロパティをコピーしたい場合は、同時にそれを行うことができます。

プロトタイプから関数を継承している場合でも、モックに関数を含めたいと想定しているため、上記のループには意図的に含めていないことに注意してください。hasOwnPropertyfrob

いくつかの関数frobを継承し、モックがhasOwnPropety元のフロブと同じ動作を示すようにしたい場合は、より創造的になることができます。

// Assumes `frob` already exists
(function() {
    var mock;
    var mockProto;
    var name;

    function FakeFrob() {
    }

    mockProto = FakeFrob.prototype;

    // Build the mock, with a function for each function
    // on the real object.
    mock = new FakeFrob();
    for (name in frob) {
        if (typeof frob[name] === "function") {
            if (frob.hasOwnProperty(name)) {
                mock[name] = function() { };
            }
            else {
                mockProto[name] = function() { };
            }
        }
    }

    // Replace the original    
    frob = mock;
})();

さて、オリジナルfrobがそれ自身foofrob.hasOwnProperty("foo")is true)を持っていたが、継承されたbarfrob.hasOwnProperty("bar")is false)である場合hasOwnProperty、あなたのモックではまったく同じことを言うでしょう。

于 2012-07-03T15:19:57.363 に答える
1

TJ Crowderが示唆しているように、 サポートされているブラウザはプロキシオブジェクトを使用してこれを実現できます。

var frob = new Proxy({}, {get: function(){return function(){}}})

仕組み:
これにより、すべてのプロパティゲッターをインターセプトするプロキシが作成され、結果が空の関数に置き換えられます。通常、プロキシオブジェクトは、呼び出しをインターセプトし、最終的にターゲットに転送するために使用されます(ここでは、ターゲットはです{})。ただし、このコードは、ターゲットを完全に無視して、やみくもに空の関数を返します。

于 2018-01-05T16:25:57.500 に答える