Javascript 删除对象定义内的属性;为什么?

Javascript 删除对象定义内的属性;为什么?,javascript,javascript-objects,Javascript,Javascript Objects,看看最近的谷歌地图API加载器,我想知道下面的目的是什么: google.maps.Load = function(apiLoad) { delete google.maps.Load; ... 为什么要在对象定义中删除对象的属性?我怀疑它可能会有一些性能提升,但无法理解属性如何在其定义内删除自身。我想说的是只允许加载一次。显然,我们只能做出假设,因为只有代码作者才能确定 如果原因是为了确保加载过程只执行一次,那么所选择的决策就非常糟糕 问题在于属性的删除使得V8(可能是其他引

看看最近的谷歌地图API加载器,我想知道下面的目的是什么:

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") };