2017-01-13 1 views
3

Le script suivant enregistre false dans la console. Est-ce que quelqu'un sait pourquoi ou quels avantages cela apporte? D'un bref coup d'œil dans le code source de Greasemonkey, je n'ai rien trouvé qui modifie Object. En regardant également dans le Object il est difficile de voir des différences significatives, toutes les fonctions sont toujours le code natif.window.Object! = Objet pour le script greasemonkey

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

console.log(window.Object == Object) 

(testé sur Firefox Greasemonkey &, pas sûr Scriptish & Chrome, bien que toutes les expériences sont les bienvenus!).

[NOTE: cette question est sans rapport avec à la question de {a: 2} != {a: 2}, s'il vous plaît lire la question elle-même et non pas seulement au regard du titre avant tout vote à proximité jeté, merci!].

+0

Vous ne pouvez pas simplement comparer des objets, car ils ne seront jamais égaux (différentes références en mémoire, etc.) [Comparaison d'objets en JavaScript] (http://stackoverflow.com/questions/1068834/object-comparison- in-javascript) – Justinas

+0

@Justinas Je ne suis pas sûr que ce soit pertinent, celui-ci est pour la classe d'objets et l'autre pour les instances. – simonzack

+0

il semble que 'window' n'est pas l'objet global dans ce cas, mais fait référence à la fenêtre-objet de la page en cours. Donc, comme deux cadres/fenêtres ne partagent pas les mêmes classes (identiques, mais pas les mêmes), 'Object' et' window.Object' ne sont pas non plus la même référence. C'est un sandbox de base, de sorte qu'une image/fenêtre n'interfère pas avec les variables globales de l'autre image/fenêtre. Imaginez qu'une page modifie 'Object.prototype' et que toutes les fenêtres de votre navigateur obtiennent cette modification. – Thomas

Répondre

3

Ceci est un effet secondaire du processus de sandbox actuel de Mozilla. Même en mode @grant none, Greasemonkey sandboxes scripts utilisant Components.utils.Sandbox - uniquement avec Xrays off et wantExportHelpers laissé à false. Par conséquent, votre window.Object == Object est équivalent à window.Object == this.Object.
Mais: Dans un script Greasemonkey, this (le root/global ceci) est toujours un objet Sandbox, pas un Window. Firefox peut avoir une bonne raison de cloner Object comme ça, mais je n'ai trouvé aucune référence en disant autant.


Chrome + Tampermonkey ne fait pas et window.Object == Object est vrai pour les scripts Tampermonkey irregardless du réglage @grant.

Chrome ne fait pas le bac à sable de la même manière.