【问题标题】:babel-runtime will not work on instance methodsbabel-runtime 不适用于实例方法
【发布时间】:2017-08-21 17:13:03
【问题描述】:

我理解 babel-runtime 和 babel-polyfill 之间的区别,第一个不填充全局范围,而后者填充。我认为 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-polyfill 替换为 babel-runtime,因为它应该更好,但现在我不确定使用什么是安全的。

【问题讨论】:

    标签: javascript babeljs babel-polyfill


    【解决方案1】:

    Here 一个解释 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 中使用 babel-polyfill 时,将定义所有不存在的 ES2015+ 方法,例如 Array.from(静态方法)或 String.prototype.repeat(实例方法)等方法。就像你说的那样污染全局状态,但是像这样的实例方法:

    myInstanceObj.repeat(4)
    

    如果 myInstanceObj 的类型具有重复方法,则将起作用。如果在运行时 myInstanceObj 是一个字符串并且你包含了 babel-polyfill,那就太好了。但是,如果您使用 babel-runtime 在编译时知道 myInstanceObj 类型的类型(当 babel 转换您的代码时,为了知道如何转换,以及调用什么方法而不是方法重复)有时会很棘手/不可能,这就是为什么上面的实例方法有时很难被 babel-runtime && transform-runtime 插件转换。

    另一方面,代码如下:

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

    真的很容易转换,我们在编译时知道 Array.from 是来自对象 Array 的方法,所以在 IE11 中我们将使用任何东西来代替它......在这里放代码......

    如果我们使用 babel-polyfill,这个方法已经存在,因为添加这个方法已经污染了全局范围,所以一切都很好。这完全取决于您的需求。

    【讨论】:

    • 那么使用 polyfill 似乎总是更安全,因为运行时将在一种情况下工作而不是在另一种情况下工作。仍然困惑为什么在 Babel-runtime 可能失败时冒险使用它。无论如何,感谢您的详细回答。
    • 在我们用于 IE9 的非常古老的应用程序中,有很多 JavaServerFaces Richfaces 组件(相当陈旧的东西),它们在多个地方被修补和破解(使用 js)以使用这个旧浏览器.如果你现在加入 babel-polyfill,其中一些 JSF 组件将会中断,因为 polyfill 修补了很多很多(很多)东西。因此,在这种情况下使用 babel-polyfill 是不可接受的,但使用 babel-runtime 是可以接受的,因为这不会破坏我们旧的 JSF 组件,但你是对的,这在某些情况下可能会失败。如果有帮助,请随时接受答案:)
    猜你喜欢
    • 2013-06-19
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多