Ссылка на объект, который будет увеличен в JavaScript - PullRequest
4 голосов
/ 16 февраля 2010

Я пытаюсь локализовать все в пространство имен в JavaScript. Поэтому у меня есть объекты, которые следуют соглашению об именах, например:

myapp.utilities.file.spinner

и т.д ...

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

myapp.utilities.file.spinner.method1 = function() { };
myapp.utilities.file.spinner.method2 = function() { };
etc.

Как то так ...

spinnerPath.method1 = function()

... где spinnerPath означает myapp.utilities.file.spinner, было бы лучше. Но из моего понимания я не могу просто сказать

spinnerPath = myapp.utilities.file.spinner

, поскольку это создаст еще один объект в глобальном пространстве.

Спасибо

Ответы [ 4 ]

4 голосов
/ 16 февраля 2010

Код, который вы используете, на самом деле не создаст новый объект , просто новую глобальную переменную, ссылающуюся на существующий объект. Однако это загрязнит глобальное пространство имен, поэтому, если вы хотите избежать этого, у вас есть несколько вариантов:

  • Вы можете использовать with, но не используйте его, потому что это, вероятно, вызовет у вас боль в сердце, чем стоит.

  • Вы можете создать сокращенную переменную-указатель внутри каждой функции вне глобального пространства имен: var s = myapp.utilities.file.spinner;, но это раздражает.

  • (вероятно, лучший вариант) создать «личное пространство имен», используя функцию немедленного вызова:

    (function (S)  
    {  
       S.method1 = function(){/*whatever*/};  
       S.method2 = function(){/*whatever*/};  
    })(myapp.utilities.file.spinner)
    
1 голос
/ 16 февраля 2010

Попробуйте это:

(function(){
  var spinner = myapp.utilities.file.spinner;
  spinner.method1 = function(){};

})();
0 голосов
/ 16 февраля 2010
myapp.utilities.file.spinner.method1 = function() { };
myapp.utilities.file.spinner.method2 = function() { };

...

// Somewhere else in your code, create a temp local called "spinner" 
// that references your longer path object.
var spinner = myapp.utilities.file.spinner;
spinner.method1();
0 голосов
/ 16 февраля 2010

Вы можете просто создать временную локальную переменную, обернутую в анонимную функцию:

(function(){
  var spinnerPath = myapp.utilities.file.spinner;
  spinnerPath.method1 = function() { };
  spinnerPath.method2 = function() { };
  spinnerPath.method1();
})();

Здесь spinnerPath фактически является локальной ссылкой на глобальный myapp.utilities.file.spinner объект, а не копией. Объекты в JavaScript являются ссылками, поэтому, если вы создадите локальную переменную, которая указывает на нее, вы не будете создавать копию или загрязнять глобальное пространство имен.

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