2

我正在尝试使用 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会在定义AppProxy时自动调用,即使在它达到var length = AppProxy.activeDocument.length 之前

那么,当 AppProxy 被定义为对象文字时,如何防止这种情况发生?我的要求有解决方法吗?

谢谢。

4

1 回答 1

4

但这就是我想要访问它的方式 -

var length = AppProxy.activeDocument.length; // no parenthesis

为此,您需要使用getter函数定义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;
于 2014-02-25T08:29:37.960 回答