Расширения пространства имен QScriptEngine - PullRequest
2 голосов
/ 13 июля 2011

Может кто-нибудь объяснить мне, как получить пространство имен в расширениях QScriptEngine? Я настроил его, поэтому у меня есть каталог foo / в разделе script / с исполняемым файлом __init __. Js.

__setupPackage__(__extension__);
print(__extension__);

hello = function() { return 5; };

И в моем C ++ коде: engine.evaluate ( "Привет ();"); // отлично работает

Итак, мой вопрос: в чем смысл файловой иерархии, такой как foo / bar / what (foo.bar.whither), если все они сосредоточены в глобальном пространстве имен? Я видел несколько примеров, когда они пытаются создать пространство имен в коде, но я не могу заставить это работать без ошибки компилятора.

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

и в моем коде C ++:

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

Я неправильно понимаю, как Qt обрабатывает пространства имен? Должно ли все действительно быть объединено в глобальную область независимо от того, из какого файла это было взято? Есть ли подходящий пример для создания такого типа пространств имен? Благодарю.

Ответы [ 3 ]

0 голосов
/ 20 июля 2011

В JavaScript мы моделируем пространства имен с помощью замыкания.Это также полезно для сокрытия определенных функций и свойств в вашем пространстве имен, которые вы не хотите открывать для пользователей

(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)

Этот шаблон частично заимствован из jQuery, но у него есть несколько преимуществ, поскольку он защищает ваш код от вредоносныхкод, который может попытаться изменить значение окна или не определено.

Я не уверен, что это полностью отвечает на ваш вопрос, но я надеюсь, что это поможет!

0 голосов
/ 20 июля 2011

Если QScriptEngine является реализацией JavaScript, то

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

или

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

должны работать нормально.В противном случае укажите точный текст синтаксической ошибки, которую вы получаете.

Если вам нужны пространства имен, вы можете рассмотреть мой TIScript: http://www.codeproject.com/KB/recipes/TIScript.aspx

0 голосов
/ 19 июля 2011

Пространства имен (как известно в таких языках, как C ++) не существуют в JavaScript.Единственный способ получить поведение, подобное пространству имен, в JS - это инкапсулировать вещи в объекте, в котором имя объекта определяет пространство имен

. В этом примере в JS будет создано «пространство имен» foo, содержащее метод 'bar', и пространство имен' foo.baz ', содержащее метод' hello ':

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

Надеюсь, это вам немного поможет.

...