2016-05-17 9 views
2

機能で関数を上書き私は拡張する方法を把握しようとしています

outdatedBrowser({ 
    bgColor: '#f25648', 
    color: '#ffffff', 
    lowerThan: 'transform', 
    languagePath: 'your_path/outdatedbrowser/lang/en.html' 
}) 

、それは...それは彼らの代わりに地雷を使用して、

をstartStylesAndEvents機能を使用しています。私は呼んで

ありがとう!

答えて

2

元のソースを変更しないでください。できません。

JavaScriptスコープのすべては機能に基づいています(現時点ではletconstclassは無視されています)。値が関数の中で宣言されている場合、その関数から返されたり、何らかの外部値を変更したりしない限り、その関数の外部にアクセスすることはできません。例えば

、このような関数を想像:

function doStuff() { 
    var times = 10; 
    for (var i = 0; i < times; i++) { 
    doThing(i); 
    } 
} 

あなたの質問はtimesを変更する方法を尋ねると意味的に同じです。それはできません。

2

内部関数は、アクセス権のないクロージャ内に含まれています。残念ながら(「何も不可能ではない」イデオロギーに反して)、これは実行時に行うことはできません。

0

これは「プライベート」機能と呼ばれることがあります。関数は他の変数と同様に格納されます。 JavaScriptでは、一般に、(ローカル変数ではなく) 'ローカルスコープ'でなければならないので、オーバーライドすることはできません。 (彼らだけがthis.functionNameを使用していた場合...より簡単にオーバーライドできます)

良いニュースは、クロスブラウザと互換性があると思われるハックです。 (IE 11でエミュレーションオプションをIE 5に戻してテストしました!)JavaScriptでは、関数自体の実際の「ソースコード」を置き換えることができます。 outdatedBrowser匿名関数(単にfunction())であることを(適切なオーバーライドは異なるビット)

var newInnerFunction = function() { // intentionally anonymous for use in eval 
} 
var overriddenFunction = eval(
    outdatedBrowser.toString() // expecting outdatedBrowser to be anonymous for use in eval 
    .replace('{', '{var startStylesAndEvents=' + newInnerFunction.toString() + ';') 
) 

注意。名前が付いている場合、evalを使用すると、元の名前で名前空間に新しい関数を追加するという副作用があります。さらに問題があった場合は、replaceを追加して対応することができます。

0

おそらく、できません。しかし、それは完全に不可能ではありません。例えば

、あなたはそのスコープオブジェクト次に外

var scope = Object.create(null); 
var outdatedBrowser = function(options) { 
    function startStylesAndEvents() { 
    console.log("bleh"); 
    } 
    with(scope) { 
    startStylesAndEvents(); // You expect this to be the private function above 
    } 
} 
outdatedBrowser(); // "bleh" 

にリークされたwith文の中startStylesAndEventsを呼び出す場合、あなたはstartStylesAndEventsへのコールを乗っ取ることができます。

scope.startStylesAndEvents = function() { 
    console.log("blah"); 
}; 
outdatedBrowser(); // "blah" 

しないでくださいもちろんこれをやってください。それは悪い、遅い、厳格なモードでは許されない。

+3

これは、残念ながら、OP用にはうまくいかない "ライブラリのソースコードに触れる"必要があります。 –

+0

@GeorgeBailey必ずしもそうではありません。問題は、ライブラリがどのように関数を呼び出すのかを示すものではありません。ライブラリがスコープオブジェクトが外部に漏洩した 'with'ステートメントの中でその関数を呼び出す場合、ライブラリを変更する必要はありません。非常に起こりにくいが、不可能ではない。 – Oriol

+0

OPは 'outdatedBrowser'の変更を避けていると思います。 –

関連する問題