Что может сделать прототипный подход, чего не может класс es6?

#javascript #ecmascript-6 #prototype #es6-class

#javascript #ecmascript-6 #прототип #es6-class

Вопрос:

Есть ли что-нибудь, чего пока можно достичь только с помощью классического / старого прототипного подхода?

Зачем мне это нужно: представьте, что я пишу подмножество JS, свободное от старого материала (прототипы вместо классов, var и т.д.)

Комментарии:

1. class это просто синтаксический сахар для прототипного наследования, поэтому я бы не назвал прототипы «старым материалом» 🙂 if(Math.random() > 0.5){ Ctor.prototype.fn = function() {}}

2. @YuryTarabanko Хм. Итак, нет возможности условно установить супер / родительский класс?

3. @YuryTarabanko О, я неправильно истолковал ваш пример как ...Ctor.prototype = ...

4. @YuryTarabanko Относительно синтаксического сахара, я согласен. Мой вопрос как раз об этом: является ли этот синтаксический сахар таким же эффективным, как исходный синтаксис?

5. Вы можете условно установить родительский класс class C extends (Math.random() > 0.5 ? A : B) {} . Вы не можете динамически (скажем, условно или в цикле) определять члены в объявлении тела класса. Вам все равно нужно принять тот факт, что существует prototype, который фактически содержит эти элементы.

Ответ №1:

Есть несколько вещей, включая, но не ограничиваясь ими:

  • При использовании function обозначения вы можете вызвать конструктор без new . class Обозначение запрещает это.

    В качестве дополнительного примечания: там, где традиционно подклассирование выполнялось бы с помощью чего-то вроде MyParentClass.call(this) (что недопустимо, когда MyParentClass было определено с помощью class ), теперь вы должны объединить class синтаксис с ключевыми словами extends и super .

  • function объявления могут появляться после их использования, поскольку они подняты, class объявления — нет.
  • function объявления могут быть переопределены новым объявлением, class объявления не могут переопределять более раннее объявление
  • Методы прототипа могут использоваться в качестве конструкторов, когда они определены в старом стиле, а не когда они определены с использованием class синтаксиса.
  • function объявления могут быть сделаны в «небрежном» режиме (не строгом), в то время как class методы всегда выполняются в строгом режиме. Как следствие, вы не можете использовать caller , callee или arguments свойства методов / конструктора в class обозначении. Все другие последствия строгого режима, конечно, также применимы. Было бы слишком далеко перечислять их все здесь.
  • Вы можете назначить новый объект prototype свойству функции старого стиля (оно доступно для записи). С class этим prototype свойством недоступно для записи (обратите внимание, что это не означает, что вы не можете изменить его).