2017-08-21 11 views
0

babel-runtimeとbabel-polyfillの違いは、最初のものがグローバルスコープを占めていないことと後者が違います。私はバベル-ランタイムが、私はこれが何を意味するのか理解できない方が安全hovewerだと思うし、それは私に影響を与えるどのように:babel-runtimeはインスタンスメソッドでは機能しません

注:例えば、「foobarの」.INCLUDESとしてインスタンスメソッドは、(「foo」が)そのため、動作しません。既存の組み込み関数を変更する必要があります(そのためにbabel-polyfillを使用します)。

私の知る限り、インスタンスメソッドはmap, filter, reduceのように、既存のオブジェクトで呼び出されるためです。どのような例がbabel-runtimeによって磨かれないのでしょうか? :

//1 
['aa', 'bb', 'cc'].forEach(console.log); 

//2 
const arr = ['aa', 'bb', 'cc']; 
arr.forEach(console.log); 

//3 
const entries = Object.entries(someObj).filter(([key, value]) => key.startsWith('hello')); 

//4 
const map = new Map(); 

//5 
var s = new Set(["foo", window]); 
Array.from(s); 

インスタンスメソッドを正確に識別するにはどうすればよいですか?

babel-runtimeのための私のプロジェクトでbabel-polyfillを置き換えましたが、今は何が安全かは分かりません。

答えて

0

Here静的メソッドとインスタンスメソッドをJavascriptで説明するリンクです。

基本的には:

function SomeClass() { 
    this.prototype.instanceMethod = function() { 
     return 'Instance method has been called'; 
    } 
} 
SomeClass.staticMethod = function() { 
    return 'Static method has been called'; 
} 
// And the invocations: 
SomeClass.staticMethod(); 
new SomeClass().instanceMethod(); 

あなたが例えばIE11でバベル-ポリフィルを使用している場合は、存在しないすべてのES2015 +メソッドは、次のとおりです。ES5で

class SomeClass { 
    instancMethod() { 
    return 'Instance method has been called'; 
    } 

    static staticMethod() { 
    return 'Static method has been called'; 
    } 
} 
// Invoking a static method 
SomeClass.staticMethod(); // Called on the class itself 
// Invoking an instance method 
var obj = new SomeClass(); 
obj.instanceMethod(); // Called on an instance of the class 

同等のようなものですArray.from(静的メソッド)やString.prototype.repeat(インスタンスメソッド)などのメソッドが定義されています。あなたが言うようにこれはグローバルな状態を汚染されていますが、などのようなインスタンスメソッドは:myInstanceObjのタイプは繰り返し方法を持っている場合

myInstanceObj.repeat(4) 

は、動作します。実行時にmyInstanceObjが文字列で、babel-polyfillをインクルードしていれば、素晴らしいことです。しかし、バブルランタイムを使用しているときに、トランスフォームする時間(メソッドのリピートの代わりにどのメソッドを呼び出すかを知るために、バーベルがコードを変換するときにmyInstanceObjタイプの型を知っている場合)上記のようなインスタンスメソッドがbabel-runtime & & transform-runtimeプラグインで変換することが難しい場合があるのはこのためです。以下のような一方のコードで

Array.from([1, 2, 3], x => x + x); 

はIE11、私たちに、私たちはその代わりに、それの、Array.fromは、オブジェクトの配列からの方法であるtranspile時に知って、変換する本当に簡単ですここにコードを入れよう...

もし私たちがbabel-polyfillを使っているのであれば、このメソッドはすでに存在しています。グローバルスコープがこのメソッドを追加するために汚染されています。それはすべてあなたが必要とするものに依存します。

+0

次に、実行時はあるケースでは動作し、他のケースでは動作しないため、常にpolyfillを使用する方が安全だと思われます。それでもバベルランタイムを使用すると、失敗する可能性があるので混乱します。とにかく詳細な答えをありがとう。 – Tomasz

+0

IE9で動作する非常に古いアプリケーションでは、この古いブラウザで動作するように、複数の場所で(jsを使用して)パッチを適用し、ハッキングしたJavaServerFacesリッチインタフェースコンポーネントがかなり古いものです。babel-polyfillが含まれていれば、これらのJSFコンポーネントのいくつかは、polyfillが多くの、多くの(多くの)パッチにパッチを当てるため、中断されます。したがって、この場合はbabel-polyfillを使用することはできませんが、これは古いJSFコンポーネントを壊すことはないので、babel-runtimeを使用することは許容されますが、そうである場合は失敗する可能性があります。それが役に立ったら答えを受け入れるように自由に感じてください:) – dalvarezmartinez1

関連する問題