两个JS例子的区别?

时间:2013-09-09 14:54:34

标签: javascript syntax

我编写了一个混淆电子邮件地址的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每次调用时都会创建一个新实例?

有什么区别?

1 个答案:

答案 0 :(得分:2)

  

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

没有。您已使用new关键字执行此操作(仅限一次),email是一个静态对象。

  

有什么区别?

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

创建模块的另一个实例
var email2 = new (email.constructor)();

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

  

我对内存使用特别感兴趣

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