在ES5中,我们都可以这样做:
myClass.prototype.myMethod = (function () {return function() {}})();
我能否使用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() })()
this
访问IIFE函数? - husnul2019年更新
是的,你可以做到。
你只需要像“函数表达式”一样创建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'
this
,但是它可以。这并不是太高科技。这些赋值是在构造函数中完成的,不要害怕。就像你写的 constructor() {this.IIFE = ...}
一样。请参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Field_declarations。 - Ruan Mendes可以创建一个装饰器:
function iife(target, key, { value: fn, configurable, enumerable }) {
return {
configurable,
enumerable,
value: fn(),
};
}
并像这样使用:
class MyClass {
@iife
methodName() {
/* some stuff */
return function() {
/* real method content */
}
}
}
如果我需要一些临时变量,例如向量矩阵之类的较重量级变量,而我不想为每个方法调用创建它们,我就会使用它。
this
关键字。class C {
constructor(attr) {
this.attr = attr;
}
IIFE = function() {
const privateArray = ["A", "B", "C"];
console.log("Created private array during object creation.");
return function() {
console.log("privateArray[1] = %s", privateArray[1]);
console.log("this.attr = ", this.attr);
}//.bind(this);
}.call(this);
}
var obj1 = new C("asdf");
console.log(obj1.IIFE());
console.log(obj1.IIFE());
var obj2 = new C("ghjk");
console.log(obj2.IIFE());
输出(未定义为返回值):
Created private array during object creation.
privateArray[1] = B
this.attr = asdf
undefined
privateArray[1] = B
this.attr = asdf
undefined
Created private array during object creation.
privateArray[1] = B
this.attr = ghjk
undefined
我必须承认我不明白为什么使用.bind(this)
是错误的。同时,我也有些困惑为什么私有数组会为每个实例创建,而不是仅存在于原型中。我不确定这是否等同于使用IIFE创建的原型方法。
无论如何,这对于部署可能过于高级,因为许多最终用户将使用2019年以前的浏览器。此外,我还没有测试性能。使用需谨慎! :-)
不行,类字面量不能包含 IIFE,它们需要由方法声明组成。
在使用 class
关键字声明 myClass
后,您可以在 ES6 中使用相同的赋值方式。然而,在 ES6 中并没有什么好的理由使用 IIFE,因为它们通常可以被块范围或模块替代。