2017-01-13 141 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還沒有做沙盒一樣。