Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как сделать вызов методов и переменных скрипта через переменную. (https://javascript.ru/forum/events/20553-kak-sdelat-vyzov-metodov-i-peremennykh-skripta-cherez-peremennuyu.html)

Kotakota 09.08.2011 14:07

Как сделать вызов методов и переменных скрипта через переменную.
 
Привет.
Допустим есть такая функция в файле blahblah.js:
(function(){
 var m = 8;
 function hi() {
  alert('Here im');
 }
})()


Есть *.html файл, куда предыдущий blahblah.js подключается:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
 </head>
 <body>
 <script type="text/javascript" src="blahblah.js">
 // Хочу вызвать фунцию hi() следующим образом.
 $BLAHBLAH.hi();
 // А теперь изменим переменную m
 $BLAHBLAH.m = 5;
 </script>
  </body>
</html>

Хочу проводить все изменения со скриптом (вызов методов, переменных и т.д.) через свою переменную $BLAHBLAH.
Такая фишка, например сделана в labJS, но я не понял как она там работает...

devote 09.08.2011 16:17

(function(window){
   var lib = {
      a: 1,
      b: function() {
         alert(lib.a);
      }
   }

   window.blahblah = lib;
})(window);




blahblah.a = 10;
blahblah.b();

Kotakota 10.08.2011 07:31

devote, спасибо!
То, что нужно!

devote 10.08.2011 07:57

можно написать с прототипами:
(function(window){
   var lib = function( params ){
      return lib.fn.init( params );
   }

   lib.fn = lib.prototype = {
      constructor: lib,
      init: function( params ) {
         this.a = params || lib.a || this.a;

         return this;
      },
      a: 1 // значение по умолчанию.
   }

   lib.fn.init.prototype = lib.fn;

   lib.fn.show = function() {

      alert( this.a );

      return this;
   }

   window.blahblah = lib;
})(window);

blahblah().show(); // отображаем значение по умолчанию у нас стоит 1
blahblah.a = 10; // меняем значение по умолчанию на 10
blahblah().show(); // отображаем значение по умолчанию.
blahblah( 234 ).show(); // отображем значение 234
blahblah().show(); // значение по умолчанию не изменилось так же 10.

Kotakota 10.08.2011 08:42

А если у меня будет несколько массивов объектов, а не только jsLoad?
И я хочу, что бы к ним была привязка через одну переменную blahblah.
Получается, что остальные массивы мне нужно будет описывать в jsLoad, чтобы их вызывать?

devote 10.08.2011 09:39

Цитата:

Сообщение от Kotakota
А если у меня будет несколько массивов объектов, а не только jsLoad?
И я хочу, что бы к ним была привязка через одну переменную blahblah.
Получается, что остальные массивы мне нужно будет описывать в jsLoad, чтобы их вызывать?

Не совсем понял что ты имеешь ввиду

devote 10.08.2011 09:43

и что за jsLoad?

Kotakota 10.08.2011 09:50

Цитата:

Сообщение от devote (Сообщение 119327)
и что за jsLoad?

Абстрагируемся от jsLoad.
Объясню на примере.
Сейчас window.blahblah = lib, то есть жестко привязана к
lib = {
 // что то там...
}

А если у меня будет так:

lib = {
//что то там 1
};
superpuper = {
// что то там 2
};
imsuperman = {
// что то там 3
};


И ко всем этим трем словарям, я хочу обращаться через blahblah.
Вопрос в том, как привязать все три (и больше) словаря к одной переменной.
У меня есть такой вариант:
lib = {
superpuper : {
 a:5
},
imsuperman : {
}
};


Обращаемся так:
blahblah.lib.superpuper.a = 8;

А хочется запись покороче...

devote 10.08.2011 10:06

blahblah.superpuper = superpuper;
blahblah.imsuperman = imsuperman;

blahblah.superpuper.a = 8;
а можно просто в библу blahblah добавить метод рассширения, например extend перед window.blahblah = lib; пишем такой код:
lib.extend = lib.fn.extend = function( obj1, obj2 ){
   var target = obj2 ? obj1 : this,
        source = obj2 || obj1;

   for( var key in source ) {
      target[ key ] = source[ key ];
   }

   return target;
}
ну и естественно вызов его будет таким:
blahblah.extend( blahblah.extend( superpuper, imsuperman ) );
и нам станут доступны свойства этих объектов прямо из объекта blahblah.

Kotakota 10.08.2011 12:53

Пока ждал Ваше сообщение, написал свой вариант:
superman = {
    b : 5
};
supergirl = {
    b : 9
}
var join = function(a,b){
 for (key in a) { 
     if (key in b) {
         continue;
     } 
 b[key] = a[key];  
 }			
}
join(superman,supergirl);


Ваше решение понравилось больше :victory:
Спасибо за пример.
Теперь это выглядит так:
var myobject = {};
myobject.extend = function(obj1, obj2, rewrite){
    var 
    target = obj2 ? obj1 : this,
    source = obj2 || obj1;
    for(var key in source) {
        if (!rewrite && key in target) { continue; }
	    target[key] = source[key];
	}
    return target;
}


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


Часовой пояс GMT +3, время: 00:45.