Javascript IIFE 作为对象的属性(方法)
-
21-12-2019 - |
题
我正在尝试使用 IIFE 作为方法(这可能是错误的)。
为什么 ?因为,我正在尝试实现代理设计模式。
在 adobe Extendscript 中,有一个“app”对象来访问文档等,例如 -
var length = app.activeDocument.length; // or some other property
现在,我想在“app”周围放置一个代理。所以我创建了一个代理对象 -
var AppProxy = {
activeDocument: function() { // do stuff...; return app.ActiveDocument; }
}
但现在,这就是我必须访问它的方式 -
var length = AppProxy.activeDocument().length;
但这就是我想要访问它的方式 -
var length = AppProxy.activeDocument.length; // no parenthesis
所以我读到了 IIFE,最后做了这个 -
var AppProxy = {
activeDocument: (function() {
// do stuff...;
return app.ActiveDocument; })()
}
正如预期的那样, AppProxy.activeDocument 被自动调用时 应用代理 被定义,即甚至在它到达之前 var length = AppProxy.activeDocument.length.
那么,当 AppProxy 被定义为对象文字时,如何防止这种情况发生呢?我的要求有解决方法吗?
谢谢。
解决方案
但这就是我想要访问它的方式 -
var length = AppProxy.activeDocument.length; // no parenthesis
为此,您需要定义 activeDocument
作为具有 吸气剂 功能。这在浏览器中是可能的 适当的支持 对于 ES5 的 getter 和 setter,这是所有现代浏览器(不是 IE8 及更早版本)。(在 ES5 之前,有一些浏览器支持的从未标准化的语法,但同样不支持 IE8 或更早版本)。
在 ES5 中,您可以使用 Object.defineProperty
或者通过在对象初始值设定项中定义 getter 来实现。这是 Object.defineProperty
:
// ES5+ only
var AppProxy = {};
Object.defineProperty(AppProxy, "activeDocument", {
get: function() {
// do stuff...;
return app.ActiveDocument;
}
});
这是将其作为对象初始值设定项的一部分进行的:
// ES5+ only
var AppProxy = {
get activeDocument() {
// do stuff...;
return app.ActiveDocument;
}
};
完成其中任何一个后,然后是这样的:
var length = AppProxy.activeDocument.length;
...运行该函数,即使它看起来不像。函数调用仍然会发生,只是被隐藏了。
但是,如果您需要支持过时的浏览器(即使在 2016 年中期,IE8 仍然拥有约 5% 的市场份额),或者如果您不想隐藏您正在调用函数的事实,只需调用该函数:
var length = AppProxy.activeDocument().length;