Одна вещь, к которой я всегда стремился и к чему стремился, это некоторая поддержка хеширования . В частности, позвольте мне отследить метаданные об объекте без необходимости добавлять свойство expando для этого объекта .
Java предоставляет Object.getHashCode()
, который по умолчанию использует базовый адрес памяти; Python предоставляет id(obj)
для получения адреса памяти и hash(obj)
для настройки; и т.д. Javascript ничего не предоставляет ни для одного.
Например, я пишу библиотеку Javascript, которая пытается незаметно и изящно улучшить некоторые объекты, которые вы мне даете (например, ваши
элементы или даже что-то, не связанное с DOM). Допустим, мне нужно обработать каждый объект ровно один раз. Поэтому после того, как я обработал каждый объект, мне нужен способ «пометить его» как видимый.
В идеале я мог бы создать свою собственную хеш-таблицу или установить (в любом случае, реализованный в виде словаря) для отслеживания:
var processed = {};
function process(obj) {
var key = obj.getHashCode();
if (processed[key]) {
return; // already seen
}
// process the object...
processed[key] = true;
}
Но так как это не вариант, я должен прибегнуть к добавлению свойства для каждого объекта:
var SEEN_PROP = "__seen__";
function process(obj) {
if (obj[SEEN_PROP]) { // or simply obj.__seen__
return; // already seen
}
// process the object...
obj[SEEN_PROP] = true; // or obj.__seen__ = true
}
Но эти объекты не мои , так что это делает мой сценарий навязчивым. Эта техника, по сути, является хакерской, чтобы обойти тот факт, что я не могу получить надежный хеш-ключ для любого произвольного объекта.
Другой обходной путь - создание объектов-обёрток для всего, но часто вам нужен способ перехода от исходного объекта к объекту-обёртке, который в любом случае требует свойства expando для исходного объекта. Кроме того, это создает циклическую ссылку, которая вызывает утечку памяти в IE, если исходный объект является элементом DOM, поэтому это не безопасная кросс-браузерная техника.
Для разработчиков библиотек Javascript это повторяющаяся проблема.