ES6类文字中的IIFE

Tri*_*ara 6 javascript ecmascript-6

在ES5中我们都可以这样做:

myClass.prototype.myMethod = (function () {return function() {}})();
Run Code Online (Sandbox Code Playgroud)

我能用ES6类文字做同样的技巧吗?

Frx*_*rem 9

不,至少还没有.ES6类仅支持声明方法,因此任何不直接作为方法的东西(包括间接评估方法的东西,如IIFE)仍必须使用原型声明.

但是,ES6类实际上与ES5构造函数的工作方式相同,只是语法更清晰,所以你仍然可以这样做:

class MyClass {
  constructor() {
    /* initialize */
  }

  regularMethod() {
    /* some stuff */
  }
}

MyClass.prototype.myMethod = (function() { return function() })()
Run Code Online (Sandbox Code Playgroud)

这相当于:

function MyClass() {
  /* initialize */
}

MyClass.prototype.regularMethod = function() {
  /* some stuff */
}

MyClass.prototype.myMethod = (function() { return function() })()
Run Code Online (Sandbox Code Playgroud)

  • 如何从 IIFE 函数访问构造函数中定义的“this”? (2认同)

Jua*_*dez 5


2019年更新


是的,你可以做到。

您只需要像“函数表达式”一样创建 IIFE(将其分配给变量)

class MyClass {

  IIFE = (() => {

    let textArrayCreatedJustOnce = ['text A', 'text B', 'text C'];
    console.log('Only called in object creation');


    return () => {
      console.log(textArrayCreatedJustOnce[1]);
    }

  })()

}


let myClassInstance = new MyClass(); //log: 'Only called in object creation' 


myClassInstance.IIFE(); //log: 'text B'
myClassInstance.IIFE(); //log: 'text B'
myClassInstance.IIFE(); //log: 'text B'
Run Code Online (Sandbox Code Playgroud)

  • 它可能不会使用“this”,但可以。这并不是什么太高科技的事情。这些赋值是在构造函数中完成的,不要害怕。就好像您编写了 `constructor() {this.IIFE = ...}` 请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Field_declarations 。 (2认同)