1

すべての にプロトタイプを追加するのは簡単ですFunction:

Function.prototype.foo = function () { return 'bar'; };
(new Function).foo();  // 'bar'

ただし、グローバル オブジェクトのプロトタイプに何かを割り当てることも悪い習慣です。これは、クロス モジュール オブジェクトの依存関係が原因であり、部分的には以前のバージョンのプロトタイプ.js の終焉につながります。

すべての関数に method を持たせたいとしfooます。私はこれに似たようなことをします:

(function () {
    var Fn = Function;
    Fn.prototype.foo = function () { return 'bar'; };

    (new Fn).foo();  // 'bar'
}());

(new Function).foo()  // also 'bar'. this is bad!

残念ながら、これはFunctionのプロトタイプにも影響します。これは、 Function が参照によってスコープされているためです。

プリミティブ値をIIFEに渡すための通常の「値のコピー」アプローチも、Functionそれ自体がオブジェクトであるため失敗します。

(function (Fn) {
    Fn.prototype.foo = function () { return 'bar'; };

    (new Fn).foo();  // 'bar'
}(Function));


Function.foo  // function () { return 'bar'; }

これらの例を考えると、私の範囲外の他のすべての関数に影響を与えずに、選択した関数のプロトタイプを拡張することは不可能であるというのは本当ですか?

4

2 に答える 2

1

newキーワードを使用してカスタム関数のプロトタイプを作成します。

そうすれば、オリジナルFunction.prototypeは変更されません。

(function (BaseFunction) {  
   var CustomFunction = function () { };
   CustomFunction.prototype = new BaseFunction();
   CustomFunction.prototype.foo = function () { return 'bar'; };
   console.log((new CustomFunction()).foo()); // 'bar'
})(Function);
console.log((new Function).foo); //undefined
于 2013-10-28T18:24:19.557 に答える