什么是可避免对象名称空间冲突的javascript哈希表实现?

时间:2020-03-06 14:26:57  来源:igfitidea点击:

首先,我正在使用一个相当模糊的JavaScript嵌入式实现作为Adobe InDesign CS3的脚本引擎。这种实现有时与"标准" javascript不同,因此是我的问题。

我正在使用John Resig的jsdiff库(在此处提供源)来比较两个文档之间的文本选择。 jsdiff使用香草对象作为关联数组,以将单词从文本映射到另一个对象。 (请参见jsdiff.js中第129行附近的" ns"和" os"变量。)

当文本中出现"反射"一词时,我就开始头痛。 " reflect"是所有对象上的默认只读属性。当jsdiff尝试将关联数组上的值分配给ns ['reflect']时,一切都会爆炸。

我的问题是:有办法解决吗?有没有办法在不使用明显的香草对象的情况下在javascript中做哈希表?

基本规则:切换脚本引擎不是一个选择。 :)

解决方案

在javascript中,给定的对象仅仅是关联数组,实际上还没有另一个内置的哈希解决方案。我们可以通过将类包装在一些数组上来创建自己的伪哈希表,尽管涉及的手动工作可能会大大降低性能。

只是我没有真正使用过或者看过jsdiff库,所以我不能根据提示或者技巧提供任何有效的见解。

我们可能正在"提出错误的问题"(正如Raymond Chen所说);与其尝试避免使用普通对象,不如尝试更改关联数组成员的命名方式。

我尝试解决此问题的方式:代替存在数组成员ns [" reflect"],更改jsdiff构建数组的方式,使该成员为ns [" _ reflect"]或者其他形式。

如果我们使用的JS实现支持对象的hasOwnProperty方法,则可以使用它来测试是否已为对象显式设置属性或者该属性是从其原型继承的。例子:

if(object.hasOwnProperty('testProperty')){
     // do something
}