我编写了一个混淆电子邮件地址的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每次调用时都会创建一个新实例?
有什么区别?
答案 0 :(得分:2)
在我看来,对象1每次调用时都会创建一个新实例吗?
没有。您已使用new
关键字执行此操作(仅限一次),email
是一个静态对象。
有什么区别?
第一个email
对象继承自代码中不明显的额外原型对象。然而,它确实例如存储初始化函数,使其成为非匿名函数。您可以通过
var email2 = new (email.constructor)();
这完全是多余的,可能是无意的。
我对内存使用特别感兴趣
第一个选项确实有一个额外的原型对象,需要在内存中保存构造函数,而第二个选项可以在使用后对IEFE进行垃圾收集。仅使用第二种模式,避免使用第一种模式。