2011-07-13 10 views
2

QScriptEngine拡張で名前空間を取得する方法を教えてもらえますか?私はそれをセットアップしたので、ディレクトリfoo/under script /があり、__init __。jsファイルが実行されています。名前空間QScriptEngine拡張

__setupPackage__(__extension__); 
print(__extension__); 

hello = function() { return 5; }; 

そして、私のC++コード内: engine.evaluate( "ハロー();"); //うまく動作します

私の質問は、foo/bar/whatever(foo.bar.whatever)のようなファイル階層のポイントは何ですか?それらがすべてグローバル名前空間にまとめられたらどうですか?いくつかの例題を見てきましたが、コード内に名前空間を作成しようとしましたが、コンパイラエラーを起こさずに動作するようには見えません。

 foo = { 
      hello : function() { return 5; } 
     }; 

と私のC++コードでの

は:

 engine.evaluate("foo.hello();"); 

私はQtは、名前空間を処理する方法を誤解していますか?どのファイルから取得されたかにかかわらず、すべてが実際にグローバルスコープにマッシュアップされるべきですか?これらのタイプの名前空間を作成するための適切な例はありますか?ありがとう。

+0

それはQScriptはあなたがオブジェクトリテラルを作成することができない可能性があるの? 'foo = new Object;を試してください。代わりにfoo.hello = function(){}; 'を呼び出します。 –

答えて

0

名前空間(C++などの言語で知られている)はJavaScriptには存在しません。 JSの名前空間のような振る舞いを取得する唯一の方法は、オブジェクトにオブジェクトをカプセル化して、オブジェクトの名前が名前空間を定義することです。

この例では、JSの名前空間fooを作成します。そして、方法を「ハロー」を含む名前空間「foo.baz」:

var foo = { 
    bar : function(){ return 5; }, 
    baz : { 
     hello : function(who){ return 'Hello ' + who + '!'; } 
    } 
}; 

が、これは少しあなたを役に立てば幸いです。

+0

それは実際にはありません。私はjavascriptが "真の"名前空間を持たないことを理解していますが、私の例で見ることができるように、私はすでにオブジェクトに関数を入れようとしていますが、実際の問題です。ありがとう。 – voodoogiant

+0

@voodoo私はあなたが試したことは知っていますが、あなたの投稿では 'foo'の前に 'var'というキーワードを忘れてしまいました。これが原因でエラーが発生する可能性はありますか? –

+0

ええ、私はvarと一緒に試してみました。 – voodoogiant

0

JavaScriptでは、クロージャを使用して名前空間をシミュレートします。これはまた、あなたがこのパターンは、部分的にjQueryのから借りている

(function(window, undefined){ 
    //declare a local object 
    myNamespace = {}; 

    //define private variables 
    var privateVar; // this wont be accessable outside of the closure 

    var privatefunct = function() { 
    alert('I can only be called by functions defined within the closure'); 
    } 

    myNamespace.publicVar = "this can be accessed outside the namespace"; 

    // this function can be called outside the closure 
    myNamespace.getPrivateVar = function() { 
    return privateVar; 
    } 

    //add your local object to the global object (aka. window in the browser) 
    window.myNamespace = myNamespace; 
})(window) 

ユーザーに開放したくないあなたの名前空間内の特定の機能やプロパティを隠すために便利ですが、それはmalliciousコードからコードを保護するのでそれはいくつかの利点を有していますwindowまたはundefinedの値を変更しようとする可能性があります。

これが完全にあなたの質問に答えるかどうかわかりませんが、私はそれが助けてくれることを願っています!

0

QScriptEngineはその後

var foo = { 
      hello : function() { return 5; } 
     }; 

または

var foo = {}; 
foo.hello = function() { return 5; }; 

必見仕事うまくJavaScript実装である場合。それ以外の場合は、構文エラーの正確なテキストを入力してください。

あなたは私のTIScript検討することができ、名前空間を必要としない場合:http://www.codeproject.com/KB/recipes/TIScript.aspx

+0

私が得ている正確なエラーは、最初の行に "Parse Error"です。上記の例がうまくいけば、QScriptEngineでTIScriptを動作させることはどうでしょうか? – voodoogiant