Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.08.2011, 13:07
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

Как сделать вызов методов и переменных скрипта через переменную.
Привет.
Допустим есть такая функция в файле 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, но я не понял как она там работает...
Ответить с цитированием
  #2 (permalink)  
Старый 09.08.2011, 15:17
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

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




blahblah.a = 10;
blahblah.b();
Ответить с цитированием
  #3 (permalink)  
Старый 10.08.2011, 06:31
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

devote, спасибо!
То, что нужно!
Ответить с цитированием
  #4 (permalink)  
Старый 10.08.2011, 06:57
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

можно написать с прототипами:
(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.
Ответить с цитированием
  #5 (permalink)  
Старый 10.08.2011, 07:42
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

А если у меня будет несколько массивов объектов, а не только jsLoad?
И я хочу, что бы к ним была привязка через одну переменную blahblah.
Получается, что остальные массивы мне нужно будет описывать в jsLoad, чтобы их вызывать?
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2011, 08:39
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Kotakota
А если у меня будет несколько массивов объектов, а не только jsLoad?
И я хочу, что бы к ним была привязка через одну переменную blahblah.
Получается, что остальные массивы мне нужно будет описывать в jsLoad, чтобы их вызывать?
Не совсем понял что ты имеешь ввиду
Ответить с цитированием
  #7 (permalink)  
Старый 10.08.2011, 08:43
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

и что за jsLoad?
Ответить с цитированием
  #8 (permalink)  
Старый 10.08.2011, 08:50
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

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

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

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


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


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

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

Последний раз редактировалось Kotakota, 10.08.2011 в 08:53.
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2011, 09:06
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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.
Ответить с цитированием
  #10 (permalink)  
Старый 10.08.2011, 11:53
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

Пока ждал Ваше сообщение, написал свой вариант:
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);


Ваше решение понравилось больше
Спасибо за пример.
Теперь это выглядит так:
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;
}


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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 19:24
Как передать переменную с jquery в php Максим2 jQuery 14 28.07.2013 10:38
Как убрать hover? Либо как сделать стрелки статичными? krusty36 Элементы интерфейса 1 13.07.2011 08:20
Как сделать переменную глобальной? AquaGen Общие вопросы Javascript 1 26.06.2011 12:55
Как сделать, чтобы при наведении на кнопку справа от нее появлялись текстовые ссылки? Tass Общие вопросы Javascript 7 17.02.2011 08:06