我正在尝试使用 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top