オブジェクトの名前空間の衝突を回避する JavaScript ハッシュ テーブルの実装とは何ですか?

StackOverflow https://stackoverflow.com/questions/103679

質問

最初に:私は、Adobe InDesign CS3 のスクリプト エンジンとして埋め込まれた、あまり知られていない JavaScript の実装を使用しています。この実装は「標準」JavaScript から逸脱することがあります。それが私の問題です。

使っています John Resig の jsdiff ライブラリ (ソースはこちら) 2 つのドキュメント間で選択したテキストを比較します。jsdiff は、バニラ オブジェクトを連想配列として使用して、テキストの単語を別のオブジェクトにマップします。(jsdiff.js の 129 行目あたりの「ns」変数と「os」変数を参照してください。)

文章中に「反省」という言葉が出てくると頭痛が始まります。「反映」がデフォルトですが、 読み取り専用 のプロパティ 全て オブジェクト。jsdiff が連想配列の値を ns['reflect'] に代入しようとすると、すべてが爆発します。

私の質問:これを回避する方法はありますか?明らかなバニラオブジェクトを使用せずにJavaScriptでハッシュテーブルを作成する方法はありますか?

基本ルール: スクリプト エンジンを切り替えるという選択肢はありません。:)

役に立ちましたか?

解決

あなたは「間違った質問をしている」かもしれません(レイモンド・チェンが言うように)。バニラ オブジェクトの使用を避けるのではなく、連想配列メンバーの名前の付け方を変更してみてください。

私がこれにアプローチしようとする方法は次のとおりです。配列メンバー ns["reflect"] の代わりに、メンバーが ns["_reflect"] またはその他のバリエーションになるように jsdiff が配列を構築する方法を変更します。

他のヒント

使用している JS 実装がオブジェクトの hasOwnProperty メソッドをサポートしている場合、それを使用して、プロパティがオブジェクトに明示的に設定されているかどうか、またはプロパティがそのプロトタイプから継承されているかどうかをテストできます。例:

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

JavaScript のオブジェクトは単なる連想配列であり、実際にはハッシュ用の別の組み込みソリューションはありません。いくつかの配列の周囲にクラスをラップすることで、独自の疑似ハッシュテーブルを作成できる場合がありますが、手動作業が伴うとパフォーマンスに重大な影響が出る可能性があります。

余談ですが、私は jsdiff ライブラリを実際に使用したり調べたりしたことがないため、ヒントやコツに関する有効な洞察を提供することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top