В ES5 мы все могли бы сделать так:IIFE в классе ES6 буквального
myClass.prototype.myMethod = (function() {return function() {}})();
Могу ли я в состоянии сделать тот же трюк с литералами класса ES6?
В ES5 мы все могли бы сделать так:IIFE в классе ES6 буквального
myClass.prototype.myMethod = (function() {return function() {}})();
Могу ли я в состоянии сделать тот же трюк с литералами класса ES6?
Нет, еще нет. Классы ES6 имеют поддержку для объявления методов, поэтому все, что не является непосредственно методом (это включает в себя вещи, которые косвенно оценивают метод, такой как IIFE), все еще должны быть объявлены прототипом.
Однако классы ES6 действительно работают так же, как функции конструктора ES5 делать, только с немного чистым синтаксисом, так что вы можете сделать это:
class MyClass {
constructor() {
/* initialize */
}
regularMethod() {
/* some stuff */
}
}
MyClass.prototype.myMethod = (function() { return function() })()
, который будет эквивалентен следующему:
function MyClass() {
/* initialize */
}
MyClass.prototype.regularMethod = function() {
/* some stuff */
}
MyClass.prototype.myMethod = (function() { return function() })()
Нет, классные литералы не могут содержать IIFE, они должны состоять из объявлений методов.
Вы можете использовать одно и то же задание в ES6, хотя после объявления myClass
с использованием ключевого слова class
. Однако на самом деле нет никаких оснований для использования IIFE в ES6 вообще, поскольку их обычно можно заменить блочными областями или модулями.
Можно обрешетке декоратор:
function iife(target, key, { value: fn, configurable, enumerable }) {
return {
configurable,
enumerable,
value: fn(),
};
}
И использовать его как:
class MyClass {
@iife
methodName() {
/* some stuff */
return function() {
/* real method content */
}
}
}
Я использую его, если мне нужны некоторые тяжелые временные переменные, как матрицы векторов, которые я не хочу для сортировки для каждого вызова метода.
Просьба показать пример того, что вы имеете в виду с литералами класса. – zzzzBov