2016-07-26 7 views
1

私はJavascriptコードで私が説明できない奇妙な状況があります。これまでのところSafari/Macでしか見られていません。Javascriptに本来読み取り専用のオブジェクトがありますか?

私はこのような行があります。

dict[id].sliceHovered = true; 

そしては時々、それはエラーがスローされます。

Attempted to assign to readonly property.

また:

  • dictはI裸空白のオブジェクトでありますdict={}で自分を作成してください。
  • idは外部のデータから提供されるため、何でもかまいません(特定の値が原因であることはまだわかりません)。
  • sliceHoveredは明らかJavascriptがで を築いてきました何かの名前ではありません。
  • 辞書内のオブジェクトは自分のタイプです。彼らはsliceHoveredのメンバーを持っていますが、それはJavaScriptの定義されたプロパティではありません(Object.defineProperty()のように)。ただ普通のプロパティです(コンストラクタはthis.sliceHovered=falseを実行します)。
  • "use strict"がオンです。
  • Object.freeze(),Object.seal(),およびconstは、コードベース全体のどこでも使用されていません。

このように、このようなエラーがどのようにスローされる可能性があるかについては非常に困惑しています。インデックス化エラーが発生し、がundefinedまたはnullになると、エラーは異なります。私の唯一のアイデアは、dictdict={}として作成されてからObjectを継承し、おそらくidがいくつかの継承プロパティにマップされているということです。しかし、dict[id]から返されたオブジェクトは、それ自体が読み取り専用でなければならないことを意味します。sliceHoveredは、明らかに既存のJavascriptプロパティの名前ではないからです。

しかし、私はそのような本質的に読み込み専用のJavascriptオブジェクトを考えることはできません。

ここで何が間違っているのでしょうか?

+0

'id = '__proto __''のときはどうなりますか?私が正しいとすれば、あなたはそれに何かを割り当てることができないので、それは読まれるだけのものです。しかし、クロムはその場合にエラーを投げず、Safariの最近のバージョンにアクセスすることはできません。 –

答えて

0

あなたはこのような状況で

My only idea is that since the dict is created as dict={} then it inherits from Object

を確認することができます。また、記述子が正しい値を持っていることを確認するObject.getOwnPropertyDescriptor(dict, id)を使用しようとvar dict = Object.create(null);

+0

私は知っています。私がデータを手に入れたら、それをテストします。 –

関連する問題