Javascript 删除对象定义内的属性;为什么?
看看最近的谷歌地图API加载器,我想知道下面的目的是什么:Javascript 删除对象定义内的属性;为什么?,javascript,javascript-objects,Javascript,Javascript Objects,看看最近的谷歌地图API加载器,我想知道下面的目的是什么: google.maps.Load = function(apiLoad) { delete google.maps.Load; ... 为什么要在对象定义中删除对象的属性?我怀疑它可能会有一些性能提升,但无法理解属性如何在其定义内删除自身。我想说的是只允许加载一次。显然,我们只能做出假设,因为只有代码作者才能确定 如果原因是为了确保加载过程只执行一次,那么所选择的决策就非常糟糕 问题在于属性的删除使得V8(可能是其他引
google.maps.Load = function(apiLoad) {
delete google.maps.Load;
...
为什么要在对象定义中删除对象的属性?我怀疑它可能会有一些性能提升,但无法理解属性如何在其定义内删除自身。我想说的是只允许加载一次。显然,我们只能做出假设,因为只有代码作者才能确定 如果原因是为了确保加载过程只执行一次,那么所选择的决策就非常糟糕 问题在于属性的删除使得V8(可能是其他引擎)无法使用所谓的“隐藏类”(这是一种优化方法,用于更快地查找对象的属性) 更好的选择是
google.maps.Load = function() {};
或
正如中的建议
参考资料:
- 这是为了确保API只加载一次。但是,当再次调用函数时,这不会引发有用的错误,但可能会导致异常
这里有一个替代解决方案,它抛出了一个更有用的错误
google.maps.Load = function() { throw new Error("Already loaded") };
delete
总是让事情变得更慢(至少在V8中是这样)。在这种情况下,它可能会自行清理,以便不可能意外地加载它两次。如果此假设有效,那么更好的解决方案是将其重新分配给空函数:google.maps.Load=function(){}代码>@zerkms好吧,我认为这会释放一些内存,从而提高整体性能——尽管这可能是一个缓慢的调用。对吗?不对。有关详细信息,请参阅。google.maps.Load=function(){抛出新错误(“已加载”)}
似乎更可靠。@Sam您介意将您的评论也作为答案发布吗?干杯,有道理!将它放在定义的末尾而不是第一行不是更好吗?从什么角度看更好?@Mahdi IMO它在顶部更透明,即,这是一个一次性函数,我也会这样做:)我接受这个答案,因为它最初提供了这个解决方案。这里有非常有趣的信息,非常感谢分享这些。
google.maps.Load = function() { throw new Error("Already loaded") };