2017-01-13 12 views
3

次のスクリプトは、falseをコンソールに記録します。なぜ誰かがそれをもたらす利益を知っていますか?window.Object!= greasemonkeyスクリプトのオブジェクト

Greasemonkeyのソースコードを一見すると、Objectを変更するものは見つかりませんでした。また、Objectを見ると、意味のある違いは見当たりません。すべての機能はまだネイティブコードです。

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

console.log(window.Object == Object) 

(任意の実験は歓迎しますが、Scriptish &クロームわからないのGreasemonkey & Firefoxの、上でテスト!)。

[注:!あなたが任意の近い票を投じる前に、この質問が{a: 2} != {a: 2}の質問に対する無関係で、おかげで、問題そのものではなく、タイトルでちょうど一見をお読みください]。

+0

オブジェクトは同じではないため、単純に比較することはできません(メモリ内のさまざまな参照など)[JavaScriptのオブジェクト比較](http://stackoverflow.com/questions/1068834/object-comparison- in-javascript) – Justinas

+0

@Justinas私はそれが適切であるかどうかはわかりませんが、これはオブジェクトクラス用であり、もう1つはインスタンス用です。 – simonzack

+0

この場合、 'window'はグローバルオブジェクトではなく、現在のページのウィンドウオブジェクトを参照しているようです。つまり、2つのフレーム/ウィンドウが同じクラス(同一ではないが同じ)を共有しないように、 'Object'と' window.Object'は同じ参照ではありません。これは基本的なサンドボックスなので、1つのフレーム/ウィンドウは他のフレーム/ウィンドウのグローバル変数と干渉しません。 1つのページで 'Object.prototype'が変更され、ブラウザのすべてのウィンドウがその変更を取得するとします。 – Thomas

答えて

3

これは、Mozillaの現在のサンドボックスプロセスの副作用です。 @grant noneモードであっても、GreasemonkeyはComponents.utils.Sandboxを使用してスクリプトを実行します.Xraysをオフにし、wantExportHelpersfalseに残すだけです。

したがって、window.Object == Objectwindow.Object == this.Objectに相当します。
しかし:Greasemonkeyスクリプトでは、this(root/global this)は常にオブジェクトであり、Windowではありません。

Firefoxには、Objectのようなクローニングの理由があるかもしれませんが、私はそれほど多くの言及を見つけることができませんでした。クローム+ Tampermonkeyこのとwindow.Object == Object@grant設定のTampermonkeyスクリプトの関わらずに当てはまりを行いません


クロムも同じようにサンドボックス化を行いません。

関連する問題