2017-01-13 6 views
3

Следующие сценарии журнала false на консоль. Кто-нибудь знает, почему и какие выгоды он приносит?window.Object! = Object для скрипта greasemonkey

С кратким взглядом на исходный код Greasemonkey я не смог найти ничего, что бы изменило Object. Также, глядя в Object, трудно увидеть какие-либо значимые отличия, все функции по-прежнему являются внутренним кодом.

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

console.log(window.Object == Object) 

(проверено на Greasemonkey & Firefox, не уверен насчет Scriptish & Chrome, хотя любые эксперименты приветствуются!).

[Примечание: этот вопрос неродственного к вопросу о {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

Это побочный эффект процесса текущей песочницы Mozilla. Даже в режиме @grant none, скрипты песочницы Greasemonkey с использованием Components.utils.Sandbox - только с Xrays off и wantExportHelpers слева на false.

Итак, ваш window.Object == Object эквивалентен window.Object == this.Object.
Но: В сценарии Greasemonkey this (корень/глобальный это) всегда является объектом Sandbox, а не Window.

У Firefox может быть веская причина для клонирования Object вот так, но я не мог найти никакой ссылки, говорящей столько же.


Chrome + Tampermonkey не делает этого и window.Object == Object верно для Tampermonkey сценариев Вне зависимости от настройки @grant.

Хром также не делает песочницу так же.

Смежные вопросы