window.Object != Object 用于 greasemonkey 脚本
window.Object != Object for greasemonkey script
以下脚本将 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}
的问题 无关,请阅读问题本身,而不要在投票前只看一眼标题,谢谢!]。
这是 Mozilla 当前沙盒进程的副作用。即使在 @grant none
模式下,Greasemonkey 沙箱脚本也使用 Components.utils.Sandbox -- 仅在 Xray 关闭且 wantExportHelpers
留在 false
.
时
因此,您的 window.Object == Object
相当于 window.Object == this.Object
。
但是:在 Greasemonkey 脚本中,this
(root/global this)总是一个 Sandbox
对象,而不是 Window
.
Firefox 可能有充分的理由像这样克隆 Object
,但我找不到任何参考资料说明这一点。
Chrome+Tampermonkey 不会执行此操作 并且 window.Object == Object
对于 Tampermonkey 脚本是正确的,无论 @grant
设置如何。
Chrome 也不会以同样的方式进行沙盒处理。
以下脚本将 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}
的问题 无关,请阅读问题本身,而不要在投票前只看一眼标题,谢谢!]。
这是 Mozilla 当前沙盒进程的副作用。即使在 @grant none
模式下,Greasemonkey 沙箱脚本也使用 Components.utils.Sandbox -- 仅在 Xray 关闭且 wantExportHelpers
留在 false
.
因此,您的 window.Object == Object
相当于 window.Object == this.Object
。
但是:在 Greasemonkey 脚本中,this
(root/global this)总是一个 Sandbox
对象,而不是 Window
.
Firefox 可能有充分的理由像这样克隆 Object
,但我找不到任何参考资料说明这一点。
Chrome+Tampermonkey 不会执行此操作 并且 window.Object == Object
对于 Tampermonkey 脚本是正确的,无论 @grant
设置如何。
Chrome 也不会以同样的方式进行沙盒处理。