在其定义中删除对象的 属性;为什么?
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") };
查看最近的 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") };