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

Расширение встроенных туземцев в ES6 с помощью Babel

Я использую Babel для расширения моего класса со встроенным встроенным массивом

class NewArray extends Array {
  first() {
    return this[0];
  }
}

var a = new NewArray(1, 2, 3);
console.log(a.length); // 3
console.log(a); // [ 1, 2, 3 ]
console.log(a.first()); // trigger error

В a.first(), я получаю эту ошибку:

console.log(a.first());
              ^ 

TypeError: a.first is not a function

Должен ли я сделать что-то еще, чтобы расширить встроенный native?

Спасибо!

4b9b3361

Ответ 1

Расширение родных классов не поддерживается Babel. Он был удален в версии 5.2.17 (см. это фиксация)

Он был удален, потому что он не работал должным образом, см. ошибку: https://phabricator.babeljs.io/T1424

Это вряд ли будет добавлено, потому что это не функция, которую можно моделировать. Нам придется ждать поддержки в браузерах (некоторые уже поддерживают его в экспериментальном режиме). Это также означает, что в настоящее время он будет вести себя по-разному в разных браузерах.

Ответ 2

Вавилон по умолчанию не может обрабатывать расширения встроенных типов. На Babel 6 вы можете сделать это с помощью https://www.npmjs.com/package/babel-plugin-transform-builtin-extend, выполнив

"plugins": [
    ["transform-builtin-extend", {
        globals: ["Array"]
    }]
]

Имейте в виду, что это может быть проблемой для более старых сред, таких как старый IE, поэтому нужно ли расширять встроенные типы, зависит от того, заботитесь ли вы об этом.

Ответ 3

Хотя я не понимаю, почему вы получаете ошибку (я не могу ее воспроизвести), вы не получите то, что вы намеревались получить от функции first().

Что вы можете сделать, так это:

   class NewArray extends Array {
      constructor(){
        super();
        this.first = function(){ return this[0]; }
      }
    }

    var a = new NewArray();
    a.push(10);
    console.log(a.first()); // 10