2016-09-02 3 views
2

В ES5 мы все могли бы сделать так:IIFE в классе ES6 буквального

myClass.prototype.myMethod = (function() {return function() {}})(); 

Могу ли я в состоянии сделать тот же трюк с литералами класса ES6?

+0

Просьба показать пример того, что вы имеете в виду с литералами класса. – zzzzBov

ответ

4

Нет, еще нет. Классы 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() })() 
+0

Не знаю, почему это было приостановлено. – Bergi

+0

Как вы получаете доступ к 'this', определенному в конструкторе из функции IIFE? – husnul

0

Нет, классные литералы не могут содержать IIFE, они должны состоять из объявлений методов.

Вы можете использовать одно и то же задание в ES6, хотя после объявления myClass с использованием ключевого слова class. Однако на самом деле нет никаких оснований для использования IIFE в ES6 вообще, поскольку их обычно можно заменить блочными областями или модулями.

1

Можно обрешетке декоратор:

function iife(target, key, { value: fn, configurable, enumerable }) { 
    return { 
    configurable, 
    enumerable, 
    value: fn(), 
    }; 
} 

И использовать его как:

class MyClass { 
    @iife 
    methodName() { 
    /* some stuff */ 
    return function() { 
     /* real method content */ 
    } 
    } 
} 

Я использую его, если мне нужны некоторые тяжелые временные переменные, как матрицы векторов, которые я не хочу для сортировки для каждого вызова метода.

Смежные вопросы