Наиболее очевидное различие заключается в следующем:
Вы можете мутировать прототип каждого класса вторым методом (включая нативный), в то время как первый синтаксис работает только для объявления ваших собственных классов (но с другой стороны).он поддерживает чистоту и структурированность).
Существуют и другие различия, которые вы можете игнорировать в большинстве случаев:
1) Методы класса не перечисляются при установкесвойство напрямую делает его перечисляемым .
Это было бы более эквивалентно синтаксису класса:
Object.defineProperty(Cat.protoype, "method2", {
value() {
console.log("m2");
},
enumerable: false, // it's the default value, this is just for clarity
writable: true,
configurable: true,
});
2) super
доступно только в методах, добавленных во время объявления(как в объектах, так и в классах) самого объекта / класса.
3) Функция .name
в первом случае является «test», а во втором - «anonymous».Это можно изменить, сделав функцию неанонимной, например, function method2() { ... }