2017-01-13 2 views
3

다음 스크립트는 false을 콘솔에 기록합니다. 누구나 왜 또는 어떤 이점을 가져다 주는지 알고 있습니까?window.Object! = greasemonkey 스크립트의 오브젝트

Greasemonkey의 소스 코드를 간단히 살펴보면 Object을 수정하는 것을 찾을 수 없습니다. 또한 Object을 살펴보면 의미있는 차이점을 찾기가 어렵고 모든 기능이 여전히 원시 코드입니다. (모든 실험은 환영하지만, Scriptish & 크롬에 대해 확실하지 그리스 몽키 & 파이어 폭스, 테스트!)

// ==UserScript== 
// @name  test 
// @namespace test 
// @include  * 
// @grant  none 
// ==/UserScript== 

console.log(window.Object == Object) 

.

[참고 : 당신이, 덕분에 어떤 가까운 투표를하기 전에이 질문 {a: 2} != {a: 2}의 질문에 관련이없는이다, 제목에서 질문 자체뿐 아니라 눈에 읽어 보시기 바랍니다!].

+0

개체가 서로 같지 않으므로 단순히 비교할 수는 없습니다 (메모리에서 다른 참조 등) [JavaScript의 개체 비교] (http://stackoverflow.com/questions/1068834/object-comparison- in-javascript) – Justinas

+0

@Justinas 관련성이 있는지 모르겠습니다.이 것은 객체 클래스 용이고 다른 하나는 인스턴스 용입니다. – simonzack

+0

이 경우'window'는 전역 객체가 아니라 현재 페이지의 윈도우 객체를 참조하는 것으로 보입니다. 따라서 두 프레임/윈도우가 같은 클래스 (동일하지만 동일하지 않음)를 공유하지 않기 때문에 'Object'와 'window.Object'는 동일한 참조가 아닙니다. 이것이 기본 샌드 박스이므로 한 프레임/창은 다른 프레임/창의 전역 변수와 간섭하지 않습니다. 한 페이지가'Object.prototype'을 수정하고 브라우저의 모든 윈도우가 그 변경을하게된다고 상상해보십시오. – Thomas

답변

3

이것은 모질라의 현재 샌드 박스 프로세스의 부작용입니다. @grant none 모드 일지라도, Greasemonkey는 Components.utils.Sandbox을 사용하여 스크립트를 처리합니다. Xrays가 꺼져 있고 wantExportHelpersfalse으로 남았습니다.

따라서 window.Object == Objectwindow.Object == this.Object과 같습니다.
하지만 : Greasemonkey 스크립트에서 this (루트/전역 this)은 항상 개체이며 Window이 아닙니다.

Firefox는 Object처럼 복제 할만한 좋은 이유가있을 수 있습니다. 그러나 나는 많은 언급을 찾을 수 없습니다.


크롬 + Tampermonkey이window.Object == Object@grant 설정 Tampermonkey 스크립트 선명하게 촬상 마찬가지입니다하지 않습니다.

크롬도 동일한 방식으로 샌드 박싱을 수행하지 않습니다.

관련 문제