2015-08-25 8 views
4

Глядя на недавний API загрузчика Google Maps source, я задаюсь вопросом, что является целью следующее:Удаление свойства объекта внутри его определения; Зачем?

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

Почему вы delete свойство объекта, внутри его определения? Я подозреваю, что это может привести к некоторому увеличению производительности, но не может понять, как свойство может удалить себя в своем определении.

+0

'delete' ** always ** делает вещи медленнее (по крайней мере, в V8). В этом случае он, скорее всего, очистится, так что не удалось случайно «загрузить» его дважды. Если это предположение справедливо, лучшим решением было бы переназначить его на пустую функцию: 'google.maps.Load = function() {};' – zerkms

+0

@zerkms хорошо, я думал, что он освободит память, и, следовательно, увеличит общая производительность - хотя это может быть медленный вызов. Это правильно? – Mahdi

+0

Это не так. Подробнее см. Http://debuggable.com/posts/understanding-hidden-classes-in-v8:4c7e81e4-1330-4398-8bd2-761bcbdd56cb. – zerkms

ответ

2

Это делается для того, что API загружается только один раз. Однако это не вызовет полезной ошибки, когда функция вызывается второй раз, но может вызвать исключение.

Это альтернативное решение, представляющее для себя более полезную ошибку.

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

Я принимаю этот ответ, поскольку он изначально предоставлял это решение. – Mahdi

3

Я бы сказал, что допустимо только один раз.

+0

Это имеет смысл! Не было бы лучше разместить его в конце определения, а не в самой первой строке? – Mahdi

+1

Лучше с какой точки зрения? – zerkms

+0

@zerkms возможно ради семантики? – Mahdi

5

Очевидно, что мы можем делать предположения только потому, что это может быть только автор кода.

Если причина заключалась в том, чтобы выполнить процедуру Load только один раз, то выбранное решение действительно плохое.

Проблема в том, что удаление свойств делает невозможным использование V8 (и может быть другими) для использования так называемых «скрытых классов» (который является методом оптимизации для поиска свойств более быстрого объекта).

Лучшей альтернативой будет

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

или

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

как предложено @Sam в comments.

Ссылки:

+0

Очень интересная информация здесь, спасибо за то, что разделили их. – Mahdi

Смежные вопросы