0

我编写了一个混淆电子邮件地址的 JS 对象,但是我发现了两种稍微不同的方法(每种方法都有 1 个私有方法和 1 个公共方法):

对象 1:

var email = new function()
{
    function encrypt(code, key)
    {
        <eliminated for brevity>
    };

    this.mailto = function(address, name)
    {
        link = encrypt(<code>, <key>);
        document.write('<a href="mailto:'+ link +'">'+ name +'</a>');
    }
};

对象 2:

var email = function()
{
    function encrypt(code, key)
    {
        <eliminated for brevity>
    };

    return {
        mailto: function(address, name)
        {
            link = encrypt(<code>, <key>);
            document.write('<a href="mailto:'+ link +'">'+ name +'</a>');
        }
    };
}();

这两种语法都有效,可以通过以下方式调用:

email.mailto('example', 'Example');

我对内存使用或可扩展性特别感兴趣。
在我看来,好像对象 1 每次被调用时都会创建一个新实例?

有什么区别?

4

1 回答 1

2

在我看来,好像对象 1 每次被调用时都会创建一个新实例?

不,您new已经(并且仅一次)使用关键字执行此操作,email它是一个静态对象。

有什么区别?

第一个email对象确实继承自代码中不明显的额外原型对象。然而,它确实存储了初始化函数,使其成为非匿名的。您可以通过以下方式创建模块的另一个实例

var email2 = new (email.constructor)();

这完全是多余的,可能是无意的。

我对内存使用特别感兴趣

第一个选项确实有一个额外的原型对象并且需要将构造函数保存在内存中,而第二个选项可以在使用后对IEFE进行垃圾收集。只使用第二种模式,避免第一种

于 2013-09-09T15:12:14.377 回答