2017-01-13 90 views
3

以下脚本将false记录到控制台。有谁知道为什么或者它带来什么好处?window.Object!=对象为greasemonkey脚本

从简单到一目了然的Greasemonkey的源代码,我找不到任何修改Object。同样看着Object,很难看到任何有意义的差异,所有的功能仍然是本地代码。

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

console.log(window.Object == Object) 

(上Greasemonkey的&火狐,不知道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 - 只有关闭和wantExportHelpers留在false X-光。

所以,你window.Object == Object相当于window.Object == this.Object
不过:在Greasemonkey的脚本,this(根/全球这一点)始终是一个Sandbox对象,而不是Window

Firefox可能有一个很好的理由克隆Object这样,但我找不到任何引用说之多。


铬+ Tampermonkey不这样做window.Object == Object对于@grant设置Tampermonkey脚本irregardless如此。

的Chrome还没有做沙盒一样。