2016-07-26 1 views
1

설명 할 수없는 Javascript 코드에 이상한 상황이 있습니다. 지금까지는 Safari/Mac에서만 관찰되었습니다. 또한Javascript에 본질적으로 읽기 전용 개체가 있습니까?

Attempted to assign to readonly property.

:이 오류가 발생 때로는

dict[id].sliceHovered = true; 

그리고 :

는이 같은 라인이

  • dict 베어 빈 객체입니다있는 I dict={}으로 자신을 만드십시오.
  • id은 외부 데이터에 의해 제공되므로 아무 것도 될 수 있습니다 (어떤 특정 값이 원인인지 아직 모르겠습니다).
  • sliceHovered 분명히 자바 스크립트에 을 구축하고 무언가의 이름이 아닙니다. DICT에
  • 객체 내 자신의 유형입니다. 그들은 sliceHovered 회원을 가지고 있지만, 자바 스크립트로 정의 된 속성이 아닙니다 (Object.defineProperty()처럼). 단지 일반 속성입니다 (생성자는 this.sliceHovered=false을 실행합니다).
  • "use strict"입니다.
  • Object.freeze(), Object.seal(), Object.preventExtensions()const은 전체 코드베이스에서 사용되지 않습니다.

따라서 이러한 오류가 여기에 어떻게 던져 질 수 있는지는 매우 혼란 스럽습니다. 색인 생성 오류가 발생하여 이 undefined 또는 null 일 경우 오류가 달라집니다. 내 생각에 dictdict={}으로 생성되었으므로 Object에서 상속받으며 id은 상속 된 속성에 매핑됩니다. 그러나 sliceHovered은 분명히 기존 Javascript 속성의 이름이 아니기 때문에 dict[id]에서 반환 된 객체는 읽기 전용이어야합니다.

그러나 본질적으로 읽기 전용 인 자바 스크립트 개체는 생각할 수 없습니다.

어떤 아이디어가 잘못되었을 수 있습니까? 확인 디스크립터를 잘 값을 가질 수 있도록 Object.getOwnPropertyDescriptor(dict, id)를 사용하려고 또한 var dict = Object.create(null);

:

+0

'id = '__proto __''일 때 어떤 일이 발생합니까? 내가 옳다면 아무 것도 지정할 수 없으므로 읽기 전용 일뿐입니다. 그러나 크롬은이 경우 어떠한 오류도 발생시키지 않으며 최근 버전의 Safari에 액세스 할 수 없습니다. –

답변

0

당신은이 상황

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

를 확인할 수 있습니다.

+0

알아요. 데이터에 손을 대면 테스트 해 보겠습니다. –