我正在尝试使用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 被定义时,自动调用 AppProxy.activeDocument ,即使它达到 var length = AppProxy.activeDocument.length < /强>
那么当AppProxy定义为对象文字时,如何防止这种情况发生? 我的要求是否有解决方法?
感谢。
答案 0 :(得分:3)
但这就是我想要访问它的方式 -
var length = AppProxy.activeDocument.length; // no parenthesis
为此,您需要将activeDocument
定义为具有 getter 功能的属性。对于ES5的getter和setter proper support的浏览器,这是可能的,这是所有现代浏览器(不是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;