Как сделать вызов методов и переменных скрипта через переменную.
Привет.
Допустим есть такая функция в файле 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, но я не понял как она там работает... |
(function(window){ var lib = { a: 1, b: function() { alert(lib.a); } } window.blahblah = lib; })(window); blahblah.a = 10; blahblah.b(); |
devote, спасибо!
То, что нужно! |
можно написать с прототипами:
(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. |
А если у меня будет несколько массивов объектов, а не только jsLoad?
И я хочу, что бы к ним была привязка через одну переменную blahblah. Получается, что остальные массивы мне нужно будет описывать в jsLoad, чтобы их вызывать? |
Цитата:
|
и что за jsLoad?
|
Цитата:
Объясню на примере. Сейчас window.blahblah = lib, то есть жестко привязана к lib = { // что то там... } А если у меня будет так: lib = { //что то там 1 }; superpuper = { // что то там 2 }; imsuperman = { // что то там 3 }; И ко всем этим трем словарям, я хочу обращаться через blahblah. Вопрос в том, как привязать все три (и больше) словаря к одной переменной. У меня есть такой вариант: lib = { superpuper : { a:5 }, imsuperman : { } }; Обращаемся так: blahblah.lib.superpuper.a = 8; А хочется запись покороче... |
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. |
Пока ждал Ваше сообщение, написал свой вариант:
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; } В ходе работы возник вопрос, немного отдаляющий тему топика... Как можно сделать здесь приватные члены? |
Ну приватные методы это те что не выходят за пределы объекта, тоесть по сути написав:
(function(window){ // это приватные переменные var private1 = 2, private2 = 10; var lib = function() { // тут мы можем обратиться к приватным переменным return private1 * 2; } // итут можем // и в любом созданном методе в этом [[scope]] // ................ window.blahblah = lib })(window); alert( blahblah.private1 ); // undefined alert( blahblah.lib() ); // = 4 |
так, например
var myobject = new function(){ var private = 'private'; return { show : function(){ alert(private); } }; } myobject.show() |
Этот способ я знаю.
Как то сам пытался вывесит alert'ом, то, что написал devote в своем последнем сообщении: alert( blahblah.private1 ); // undefined А как это можно сделать в рамках объекта? Что то типа: myobject = { a = 5; // Как сделать ее приватной? } Мои мысли уходят примерно в это русло: myobject = { a : function(){ a = 5}; } Как то так.... |
никак
|
var a = { b : "hello!" }; Object.defineProperty( a , "prop", { value : "WTF?" }); // a.prop -> "WTF?" a.prop = "ololo"; // а теперь это "ololo" alert( a.prop ); for( var i in a ) alert( "a[ "+i+" ] = "+a[i] ); // prop типа приватная |
melky,
Дык он про константы чтоль имел ввиду? Видимо я его не понял =) |
а там не константа
он хотел типа такого a = { private string MyStr = "Mystring!"; } MAKEMAGIC ( a.MyStr ); // YAHOO! -> "Mystring!" |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Спасибо, поразбираюсь. |
Часовой пояс GMT +3, время: 00:02. |