Подтвердить что ты не робот

Почему Object.assign() требует polyfill, когда используется загрузчик babel?

Я пытаюсь использовать Object.assign() в веб-приложении ES6, скомпилированном Babel с webpack, но я получаю сообщение об ошибке:

Uncaught TypeError: Object.assign is not a function

Я уже использую babel-loader, чтобы перевести ES6 на ES5, так что все мои другие ES6-коды работают. Тем не менее, Object.assign() работает только после того, как я также import "babel-core/polyfill" в моей кодовой базе. Я вижу, что я также могу исправить эту импортируя babel-runtime, но я хотел бы понять, почему Object.assign() требует больше, чем выполняет babel-loader - shouldn ' t babel-loader препроцесс всего, включая Object.assign()?

4b9b3361

Ответ 1

Вавилон через babel-loader переносит различия в синтаксисе ES6. Babel сам по себе абсолютно ничего не добавляет в стандартную библиотечную функциональность ES6 (например, Object.assign). Загрузка polyfill загружает отдельный polyfill core-js для вас, но вы можете загрузить любой polyfill, который вы хотите.

Даже некоторые преобразования синтаксиса полагаются на определенные функциональные возможности polyfill, чтобы быть загруженными, поскольку некоторый синтаксис основан на алгоритмах и поведении, реализованных в библиотечном коде. Элементы ES6 на http://babeljs.io/docs/learn-es2015/ перечисляют, какие стандартные функции библиотеки предполагается загруженными.

Ответ 2

Object.assign() - это новый API, который является частью спецификации ES6, поэтому он еще не реализован в большинстве браузеров. См.: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

Поэтому, когда вы импортируете babel-core/polyfill, он добавляет к нему и другие новые API, чтобы ваш ES6-код мог их использовать.

babel-loader - это просто транспилятор, который преобразует синтаксис ES6 в код, совместимый с ES5.

Ответ 3

Если вы перейдете к "Совместимость", вы увидите, что IE 11 не поддерживается как в Web, так и в Mobile для объекта object.assign. Это также дает вам почин для этого.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

if (typeof Object.assign != 'function') {
   Object.assign = function(target, varArgs) {
'use strict';
if (target == null) { // TypeError if undefined or null
  throw new TypeError('Cannot convert undefined or null to object');
}

var to = Object(target);

for (var index = 1; index < arguments.length; index++) {
  var nextSource = arguments[index];

  if (nextSource != null) { // Skip over if undefined or null
    for (var nextKey in nextSource) {
      // Avoid bugs when hasOwnProperty is shadowed
      if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
        to[nextKey] = nextSource[nextKey];
        }
       }
     }
   }
   return to;
  };
 }

Если вы используете Babel

https://babeljs.io/docs/plugins/transform-object-assign/

Если вы используете NPM

https://www.npmjs.com/package/object-assign