Во-первых: я использую довольно неясную реализацию встроенного JavaScript в качестве движка сценариев для Adobe InDesign CS3. Эта реализация иногда отличается от "стандартного" javascript, отсюда и моя проблема.
Я использую Библиотека jsdiff Джона Ресига (источник здесь) для сравнения выделений текста в двух документах. jsdiff использует стандартные объекты как ассоциативные массивы для сопоставления слова из текста с другим объектом. (См. Переменные «ns» и «os» в jsdiff.js, около строки 129.)
Мои головные боли начинаются, когда в тексте встречается слово «размышлять». «Отражать» - это свойство по умолчанию только чтение для объектов все. Когда jsdiff пытается присвоить значение в ассоциативном массиве ns ['отразить'], все взрывается.
Мой вопрос: есть ли способ обойти это? Есть ли способ создать хеш-таблицу в javascript без использования очевидного ванильного объекта?
Переключение механизмов сценариев Ключевые правила: не является вариантом. :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо заданные объекты в javascript - это просто ассоциативные массивы, на самом деле нет другого встроенного решения для хеша. Возможно, вы сможете создать свою собственную хеш-таблицу псевдо-хэширования, обернув класс вокруг некоторых массивов, хотя ручная работа, вероятно, значительно снизит производительность.
Просто примечание, я на самом деле не использовал и не смотрел библиотеку jsdiff, поэтому я не могу предложить какое-либо достоверное представление о советах или приемах.
Возможно, вы «задаете неправильный вопрос» (как сказал бы Рэймонд Чен); вместо того, чтобы избегать использования обычных объектов, попробуйте изменить способ именования членов ассоциативного массива.
Я бы попытался подойти к этому: вместо того, чтобы быть членом массива ns ["отражать"], измените способ, которым jsdiff строит массивы, так, чтобы член был ns ["_ отражать"] или какой-либо другой вариант этого.
Если используемая вами реализация JS поддерживает метод hasOwnProperty для объектов, вы можете использовать его, чтобы проверить, было ли свойство явно установлено для объекта или свойство наследуется от его прототипа. Пример:
if (object.hasOwnProperty('testProperty')){
// do something
}
Я хлопнул себя по лбу вскоре после того, как задал вопрос. Это, конечно, помогло. Спасибо!