在其定义中删除对象的 属性;为什么?

Deleting a property of an object inside its definition; Why?

查看最近的 Google 地图 API 加载程序 source,我想知道以下内容的目的是什么:

google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    ...

为什么要 delete 一个对象的 属性,在它的定义中?我怀疑它可能会提高一些性能,但无法弄清楚 属性 如何在其定义内删除自身。

我会说只允许加载一次。

显然我们只能做出假设,因为只有代码作者才能确定。

如果原因是为了确保 Load 过程只执行一次,那么选择的决定真的很糟糕。

问题是删除属性使得 V8(也可能是其他引擎)无法使用所谓的 "hidden classes"(这是一种用于更快地查找对象属性的优化方法)。

更好的选择是

google.maps.Load = function() {};

google.maps.Load = function() { throw new Error("Already loaded") };

根据 @Sam in the 的建议。

参考文献:

这是为了确保 API 只加载一次。但是,这不会在第二次调用该函数时抛出有用的错误,但可能会导致异常。

这是一个替代解决方案,它会抛出一个更有用的错误。

google.maps.Load = function() { throw new Error("Already loaded") };