babel-runtime не будет работать с методами экземпляра

Я понимаю разницу между babel-runtime и babel-polyfill в том, что первая не заполняет глобальную область видимости, а вторая — заполняет. Я думаю, что babel-runtime безопаснее, но я не могу понять, что это значит и как это влияет на меня:

ПРИМЕЧАНИЕ. Методы экземпляра, такие как "foobar".includes("foo"), не будут работать, так как это потребует модификации существующих встроенных модулей (для этого используйте babel-polyfill).

Насколько я понимаю, методы экземпляра похожи на map, filter, reduce, потому что они вызываются для существующего объекта. Какой пример из этого не будет проверен средой выполнения Babel? :

//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, так как он должен был быть лучше, но теперь я не уверен, что безопасно использовать.


person Tomasz Mularczyk    schedule 21.08.2017    source источник


Ответы (1)


здесь ссылка, объясняющая статические методы против методов экземпляра в 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();

Например, при использовании babel-polyfill в IE11 определяются все отсутствующие методы ES2015+, такие как Array.from (статический метод) или String.prototype.repeat (метод экземпляра). Это загрязняет глобальное состояние, как вы говорите, но такие методы экземпляра, как:

myInstanceObj.repeat(4)

будет работать, если тип myInstanceObj имеет метод Repeat. Если во время выполнения myInstanceObj является строкой, и вы включили babel-polyfill, тогда отлично. Но если вы используете среду выполнения babel, знание типа myInstanceObj во время транспиляции (когда babel преобразует ваш код, чтобы узнать, как преобразовать и какой метод вызывать вместо повторения метода) иногда сложно/ невозможно, поэтому методы экземпляра, такие как приведенный выше, иногда трудно преобразовать с помощью плагина babel-runtime && transform-runtime.

С другой стороны код вроде:

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

действительно легко преобразовать, мы знаем во время транспиляции, что Array.from - это метод from из массива объектов, поэтому вместо него в IE11 мы будем использовать что угодно.... введите код здесь...

Если мы используем babel-polyfill, этот метод уже есть, так как глобальная область видимости была загрязнена, чтобы добавить этот метод, так что снова все в порядке. Все зависит от того, что вам нужно.

person dalvarezmartinez1    schedule 17.12.2017
comment
Тогда кажется, что всегда безопаснее использовать полифилл, потому что среда выполнения будет работать в одном случае, а не в другом. Все еще не понимаю, зачем рисковать, используя Babel-среду выполнения, когда она может выйти из строя. Спасибо за подробный ответ в любом случае. - person Tomasz Mularczyk; 18.12.2017
comment
В нашем очень старом приложении, созданном для работы с IE9, есть много компонентов Richfaces JavaServerFaces (довольно старые вещи), они пропатчены и взломаны (с помощью js) в нескольких местах для работы с этим старым браузером. Если вы сейчас придете и включите babel-polyfill, некоторые из этих JSF-компонентов БУДУТ СЛОМАТЬСЯ, потому что polyfill исправляет многие, многие (многие) вещи. Поэтому в данном случае неприемлемо использовать babel-polyfill, но допустимо использовать babel-runtime, потому что это не сломает наши старые компоненты JSF, но вы правы, в некоторых случаях это может привести к сбою. Не стесняйтесь принять ответ, если он был полезен :) - person dalvarezmartinez1; 19.01.2018