Javascript IIFE作为对象的属性(方法)

时间:2014-02-25 08:24:17

标签: javascript design-patterns extendscript iife

我正在尝试使用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定义为对象文字时,如何防止这种情况发生? 我的要求是否有解决方法?

感谢。

1 个答案:

答案 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;