2013-05-27 65 views
1

每次我需要加載一個腳本loadSubscript我必須將所有「需要的變量」複製到該上下文。例如:如何將當前上下文設置爲變量? (loadSubscript)

var ctx; 
ctx.window = window; 
ctx.console = window.console; 
ctx.MyOwnClass1 = MyOwnClass1; 
ctx.MyOwnClass2 = MyOwnClass2; 
ctx.MyOwnClass3 = MyOwnClass3; 

Services.scriptloader.loadSubScript("file://" + filePath, ctx, "UTF-8"); 

如果我有2或3類,這不是一個問題,但現在我需要上下文知道20個類。所以,我認爲必須有一些方法將當前上下文設置爲一個變量。例如:

var ctx = this.context; 

你知道嗎?一些想法?

回答

3

您應該使用自己的上下文作爲加載腳本的JavaScript上下文的原型。如果ctx是一個普通的對象,那麼你可以使用Object.create()

var ctx = Object.create(window); 

如果ctx是一個沙箱,那麼你可以使用sandboxPrototype option:可用

var ctx = new Components.utils.Sandbox(systemPrincipal, {sandboxPrototype: window}); 

所有屬性window(包括全局函數/變量)將自動在ctx對象上提供。

注意:我在這裏假設window是您的全局對象(定義全局變量的對象)。對於在XUL/HTML文檔中運行的代碼,這將是正確的。但是,在沙箱內部運行的代碼(例如,自舉插件的bootstrap.js)將不具有window對象 - 您只能在頂級代碼中訪問全局對象this

+0

使用這是最好的解決方案! – gal007

1

也許你可以嘗試將設置上下文ctx設置爲thisnullloadSubscript文檔確實聲明它是一個可選參數。


從早期的編輯等答案:

如果你敢,你可以嘗試用擺弄:

Object.keys(this)Object.getOwnPropertyNames(this);

隨着Firefox的devtools:暫存器

var v1,v2,v3; 
function MyClass1(){}; 
function MyClass2(){}; 
function MyClass3(){}; 
[Object.keys(this).join(", "),Object.getOwnPropertyNames(this).join(", ")].join("\n"); 

/* 
outputs: 
__SCRATCHPAD__, v1, v2, v3, MyClass1, MyClass2, MyClass3 
Object, Function, eval, Components, ... ... , ArrayBuffer, WeakMap, Map, Set, Proxy 
*/ 

有了,你可以把一個片斷(在全球範圍內與this)來過濾感興趣像這樣的類名:

Object.keys(this).forEach(function(key){ 
    if(key.match(/^SomeNamespacedClassName/)){ 
     ctx[key] = this[key]; 
    } 
}); 

是的,它可能很俗氣,但無論什麼作品。

相關問題