2017-08-21 47 views
0

我明白,第一个不填充全球范围内,而后者则巴贝尔运行时和巴别塔,填充工具之间的区别工作。我认为巴贝尔,运行更安全hovewer我不明白这意味着什么,以及它如何做的效果我:巴别塔运行时将不会在实例方法

注:实例方法,如“foobar的” .includes(“富”)将不会因为这项工作将需要修改现有的内置插件(使用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); 

我该如何正确识别实例方法?

我在项目通天塔运行时所取代巴贝尔,填充工具,因为它应该是更好的,但现在我不知道什么是可以放心使用。

回答

0

Here这也解释了静态方法VS在Javascript实例方法的链接。

基本上是:

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 

在ES5相当于是一样的东西:

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 +方法中不存在的定义的方法,如Array.from(静态方法)或String.prototype.repeat(实例方法)。这是污染全局状态像你说的,但实例方法,如像:

myInstanceObj.repeat(4) 

会工作,如果myInstanceObj的类型有重复的方法。如果在运行时myInstanceObj是一个字符串,并且包含了babel-polyfill,那么很好。但是如果你正在使用babel-runtime知道传输时myInstanceObj类型的类型(当babel转换你的代码时,为了知道如何转换,以及调用什么方法而不是重复的方法)有时是棘手的/不可能,这就是为什么像上面那样的实例方法有时难以通过运行时插件转换为babel运行时的原因。

在另一方面这样的代码:

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

是很容易改变的,我们知道在transpile时间Array.from是从对象数组的方法,所以不是它,在IE11我们如果我们使用巴别塔,填充工具将使用什么....把这里的代码...

,这种方法已经出现,因为在全球范围内已经被污染添加此方法,因此所有再好。这完全取决于你需要的东西。

+0

然后好像它总是安全使用填充工具,因为运行时会在一种情况下工作,而不是其他。仍然困惑为什么冒险使用Babel运行时可能会失败。无论如何感谢您的详细解答。 – Tomasz

+0

在我们做与IE9的工作非常旧的应用程序,也有很多JavaServerFaces RichFaces组件(很旧的东西),它们被修补,并在多个地方砍死(与JS)这个老浏览器的工作。如果你现在加入了babel-polyfill,那么这些JSF组件中的一些就会崩溃,因为polyfill会修补许多(很多)事物。因此,在这种情况下使用babel-polyfill是不可接受的,但使用babel-runtime是可以接受的,因为这不会破坏我们旧的JSF组件,但是你是对的,这可能会失败。如果有帮助,请随时接受答案:) – dalvarezmartinez1

相关问题