2015-08-21 56 views
48

我試圖通過與通天編譯的WebPack一個ES6的Web應用程序使用Object.assign(),但我得到一個錯誤:爲什麼在使用babel-loader時Object.assign()需要填充?

Uncaught TypeError: Object.assign is not a function 

我已經使用babel-loader到transpile ES6到ES5,所以我所有的其他ES6代碼正在工作。然而,Object.assign()只有在我的代碼庫中還有import "babel-core/polyfill"後才能正常工作。我看到我也可以修復這個by importing babel-runtime,但是我想了解爲什麼Object.assign()需要比babel-loader更高的性能 - 不應該babel-loader預處理所有內容,包括Object.assign()

+10

只是說明了未來的讀者:在填充工具,叫做「通天核心/ polyfill「在時間th在這個問題上寫了,現在是「babel-polyfill」,按[文檔](https://babeljs.io/docs/usage/polyfill/)。 –

回答

45

巴貝爾,通過babel-loader,在ES6 語法 transpiles差異。 Babel本身在ES6標準庫功能(例如Object.assign)中完全沒有添加任何內容。加載填充爲你加載一個單獨的填充core-js,但你可以加載任何你想要的填充。

即使一些語法轉換依賴於特定的polyfill功能來加載,因爲某些語法依賴於庫代碼中實現的算法和行爲。 http://babeljs.io/docs/learn-es2015/上的ES6功能部件列出了哪些標準庫功能被假定爲已加載。

+0

很好的解釋!謝謝! –

3

如果你去兼容性,你可以看到IE 11是不支持Web和移動object.assign。它也爲你提供了pollyfill。

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; 
    }; 
} 

如果使用巴貝爾

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

如果使用NPM

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

相關問題