Почему свойство «прототип» отсутствует в методах определения классов ES6 - PullRequest
0 голосов
/ 06 декабря 2018

Es6, Классы есть.У нас есть метод (go) следующим образом:

пример в ES6

class X{
   go(){}
}

var y = new X();
var z = new y.go();
console.log(z)

Пример снимка экрана с ошибкой:

Screen Shot

У нас нет прототипа свойства этого метода (go), поэтому мы не можем создать новый объект из этого метода.Это факт.Но я не могу понять, ПОЧЕМУ?Почему разработчики javascript в ES6 не позволяют мне использовать эту функциональность.

И наоборот, в ES5 мы можем создать новый экземпляр из методов Object.Конечно, это работает и из методов прототипа

пример в Es5

function X (){}
X.prototype.go = function(){}

var y = new X();
var z = new y.go();
console.log(z)

1 Ответ

0 голосов
/ 06 декабря 2018

Но я не могу понять, ПОЧЕМУ?

ES2015 различает два типа функций:

  • вызываемые функции: функции, которые можно вызывать без new, т.е. foo().
  • конструируемые функции: функции, которые можно вызывать с помощью new.

Возможность вызова или конструирования функции, или и того, и другого, зависит от того, как она определена.Спецификация просто диктует, что функции, объявленные через синтаксис метода, не могут быть построены.

Теперь, это не объясняет причины этого решения.Я не могу говорить за комитет TC39, но с ES2015 были предприняты четкие усилия, чтобы уменьшить некоторые неожиданные действия в отношении функций.Как таковое было установлено, как могут использоваться определенные типы функций.Метод концептуально не является конструктором, и поэтому вы не можете вызывать его как таковой.


Возможные функции:

  • Классы

Функции, которые можно вызывать:

  • Функции стрелок
  • Методы объекта / класса (через синтаксис метода)
  • Функции генератора
  • Асинхронные функции

Оба:

  • Объявления функций / выражения
...