Как я могу добавить свойство объекта к глобальному объекту в jhasascript носорога - PullRequest
7 голосов
/ 22 июля 2009

У меня есть некоторые свойства в объекте, которые я хотел бы добавить в глобальное пространство имен. В javascript в браузере я мог просто добавить его к объекту window следующим образом:

var myObject = {
  foo : function() {
    alert("hi");
  }
  // and many more properties
};

for (property in myObject) {
  window[property] = myObject[property];
}

// now I can just call foo()
foo();

Но поскольку у носорога нет объекта глобального окна, я не могу этого сделать. Есть ли эквивалентный объект или какой-то другой способ сделать это?

Ответы [ 5 ]

10 голосов
/ 23 марта 2010

Я нашел довольно блестящее решение на NCZOnline :

function getGlobal(){
  return (function(){
    return this;
    }).call(null);
}

Ключом к этой функции является то, что объект this всегда указывает на глобальный объект в любое время, когда вы используете call() или apply() и передаете значение NULL в качестве первого аргумента. Так как нулевая область действия недопустима, интерпретатор вставляет глобальный объект. Функция использует внутреннюю функцию, чтобы гарантировать, что область действия всегда корректна.

Звоните используя:

var glob = getGlobal();

glob вернет [object global] в Rhino.

7 голосов
/ 22 июля 2009

Вы можете использовать this, который ссылается на глобальный объект, если текущая функция не вызывается как метод объекта.

5 голосов
/ 22 июля 2009

Вот как я это делал в прошлом:

// Rhino setup
Context jsContext = Context.enter();
Scriptable globalScope = jsContext.initStandardObjects();

// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);
1 голос
/ 22 июля 2009

Вы можете просто определить свой собственный window объект как переменную верхнего уровня:

var window = {};

Затем вы можете присвоить ему значения по своему усмотрению. («window», вероятно, не лучшее имя переменной в этой ситуации.)

См. Также: Можно ли создать объект 'window' для javascript, работающего в Java6 Rhino Script Engine

0 голосов
/ 22 июля 2009

Я не использовал носорога, но не могли бы вы просто использовать var?

т.е.

<code>
var foo = myObject.foo;
foo();

Edit: Блин знал, что будет подвох! В этом случае предложение Майлза было бы хорошим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...