【问题标题】:window.Object != Object for greasemonkey scriptwindow.Object !=greasemonkey 脚本的对象
【发布时间】:2017-01-13 07:21:35
【问题描述】:

以下脚本将false 记录到控制台。有谁知道它为什么或带来什么好处?

简要浏览一下 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} 的问题无关,请阅读问题本身,而不是在投出任何接近的票之前只看标题,谢谢!]。

【问题讨论】:

  • 你不能简单地比较对象,因为它们永远不会相等(内存中的不同引用等等)Object comparison in JavaScript
  • @Justinas 我不确定这是否相关,这个用于对象类,另一个用于实例。
  • 在这种情况下,window 似乎不是全局对象,而是引用了当前页面的窗口对象。因此,就像两个框架/窗口不共享相同的类(相同但不相同),Objectwindow.Object 也不是相同的引用。这是基本的沙盒,因此一个框架/窗口不会干扰另一个框架/窗口的全局变量。想象一下,一页会修改Object.prototype,而您浏览器中的所有窗口都会发生这种变化。
  • 或者如果您的浏览器中的所有页面都共享同一个location 对象;)
  • @Thomas 嗯,好主意,虽然我认为用户脚本只能在它运行的当前页面上操作,这与插件不同。在测试脚本中没有@grants 所以没有额外的权限。但也许这样的事情仍在继续,我想知道在哪里可以找到实现这一点的代码/文档。

标签: javascript firefox greasemonkey userscripts


【解决方案1】:

这是 Mozilla 当前沙盒进程的副作用。即使在@grant none 模式下,Greasemonkey 也会使用Components.utils.Sandbox 对脚本进行沙箱处理——仅在 X 射线关闭且wantExportHelpers 留在false 的情况下。

所以,您的window.Object == Object 等同于window.Object == this.Object
但是:在 Greasemonkey 脚本中,this(根/全局 this)始终是 Sandbox 对象,而不是 Window

Firefox 可能有充分的理由像那样克隆 Object,但我找不到任何参考资料。


Chrome+Tampermonkey 不这样做window.Object == Object 适用于 Tampermonkey 脚本,无论 @grant 设置如何。

Chrome 也不会以同样的方式进行沙盒处理。

【讨论】:

  • 那么我该如何正确编写window.Object === Object 以便它在 GreaseMonkey 中工作?
  • @Aran-Fey,我不支持 Greasemonkey 4+(并且有一个单独的标签)。但是,如果 unsafeWindow 不能满足您的 true 目的,那么您将使用脚本注入。另见stackoverflow.com/a/25785794/331508
猜你喜欢
  • 1970-01-01
  • 2019-09-13
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多