#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
свойством недоступно для записи (обратите внимание, что это не означает, что вы не можете изменить его).