Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Не могу найти ошибку


Автор: Diesel Draft 17.7.2007, 01:26
Код

 function TCommand(name){
    this.name        = name;
    this.param        = new Array();
  
  this.func     = null;
  this.id       = 0;
    
    this.set = function(key, value){
        
      this.param[key] = value;
                  //alert('-- ' + Object.toJSON(this.param));
    }
  
    this.get = function(key){
      return this.param[key];
    }  
 }


Удалось присвоить только  this.name и то при инициализации

Код

comm = new TCommand('loadchat');
    comm.set('sid', sid);
    comm.func = this.recomm_loadchat;



функция set вызывается.

Помогите, а  то уже глаза болят искать

Автор: Zeroglif 17.7.2007, 01:58
Diesel Draft, 

в показанном коде всё нормально, свойства к объекту comm цепляются, только при вызове в comm.set() вторым аргументом передаётся неизвестно что (некто sid)...

Автор: Diesel Draft 17.7.2007, 02:04
ставлю алерты, аргументы передаются. Заметь что func тоже нет

Автор: Zeroglif 17.7.2007, 02:36
Цитата(Diesel Draft @  17.7.2007,  02:04 Найти цитируемый пост)
ставлю алерты, аргументы передаются. Заметь что func тоже нет

Что вижу, то и кладу в консоль Firebug-а и Maxthon-a для проверки. Остальной код остался за кадром, может он тебе и мешает, мне не видно. То, что нет func - не важно, ты же описал совсем другие проблемы.

Код

 function TCommand(name){
    this.name  = name;
    this.param = new Array();
    this.func  = null;
    this.id    = 0;   
    this.set = function(key, value) {
        this.param[key] = value;
    }
    this.get = function(key){
      return this.param[key];
    }  
 }

 //-> создали объект, навешали ему свойства
 comm = new TCommand('loadchat');
 //-> смотрим на эти свойства
 alert(f(comm));
 //-> добавим свойство массиву
 comm.set('sid', 'preved medved');
 //-> посмотрим на это свойство
 alert(comm.get('sid'));
 
 //-> функция, чтоб потестить наличие свойств
 function f(o) {
    var a = [];
    for (var i in o) {
        a[a.length] = [i,':',o[i],'(', typeof o[i],')'].join(' ');
    }
    return a.join('\n\n');
 }

Автор: Diesel Draft 17.7.2007, 02:52
Открываю сверх секретные данные smile

Я не могу понять почему оно не пашет. Найди comm = new TCommand('loadchat');  это начало

Автор: Zeroglif 17.7.2007, 12:03
Diesel Draft, 

хех... переноси в тему про библиотеки... раз у тебя там prototype.js подгружается, у меня алерты нормально работают до запроса index.php5, а как там дальше разбирать - не ведаю.

Автор: Diesel Draft 17.7.2007, 19:25
Firebug тоже говорит что все ок :(

Но делаю так

Код


 comm = new TCommand('loadchat');
comm.set('sid', sid);
comm.func = this.recomm_loadchat;

alert('__ ' + Object.toJSON(comm)); 



И оно выводит все кроме параметров и func 

Автор: Diesel Draft 18.7.2007, 00:21
Я здесь кажется баг обнаружил. Делаю так:

Код


 function TCommand(name){
    this.name        = name;
    this.param        = ["blablabla"];
  
  this.func     = null;
  this.id       = 0;
    
    this.set = function(key, value){
        
      this.param[key] = value;
      
    }
  
    this.get = function(key){
      return this.param[key];
    }  
 }


 ...........

    box = new TMailBox();
  
    comm = new TCommand('loadchat');
    comm.set('sid', sid);
    comm.set('sid2', sid);  
    
    comm.param['fgf']  = 'dfdf';
    
    comm.func = this.recomm_loadchat




результат на картинке. Я в шоке. Что делать?

Автор: Diesel Draft 18.7.2007, 12:11
ау, это безнадежно? 

ап

Автор: Diesel Draft 18.7.2007, 14:28
А когда делаю 
Код

comm.set(1, sid);


То он добавляет. Такое ощущение что все ассоциативные ключи оно считает как пропертю. Что за глюк. Есть метод через который можно присвоить значение массиву по ключу?


Через 5 мин:

Поставил заместь 
Код

this.param        = new Array();


Код

this.param        = new Object();


Теперь все кажется ок. Но так не должно быть. И это что я сделал неправильно

Автор: SelenIT 18.7.2007, 15:05
Diesel Draft, так насколько мне известно, у массивов в JS и не может быть нечисловых ключей. Этим они и отличаются от хешей, роль которых в JS выполняют объекты...

Автор: Diesel Draft 18.7.2007, 15:17
В JS кажется может. Раньше я ж использовал их

Автор: SelenIT 18.7.2007, 15:25
Diesel Draft, в таком случае именно именованные проперти и должны получаться. Насколько я знаю, их можно назначать всему, кроме примитивов...

Автор: Diesel Draft 18.7.2007, 15:30
Думаю это я затупил, спасибо что помог разобраться.

Автор: Zeroglif 18.7.2007, 16:56
Цитата(SelenIT @  18.7.2007,  15:05 Найти цитируемый пост)
насколько мне известно, у массивов в JS и не может быть нечисловых ключей

Массивы суть те же объекты, которым просто дали больше власти и плётку по имени length. Если под ключом подразумевать свойство, то там может быть много чего, на выходе сработает конвертация в строковое представление. Массиву нужно тупо отличить обычное свойство от индекса, то есть свойства P, удовлетворяющего условию: P равно ToString(ToUint32(P)) с учётом максимального размера.

Код

var a = [];

a[0]            = 0;
a['1']          = 1;
a[false]        = 2;
a[null]         = 3;
a[undefined]    = 4;
a[[1,2,3]]      = 5;
a[{}]           = 6;
a[function(){}] = 7;
a[a]            = 8;
a[/\d/g]        = 9;

//->в итоге добавляем 10 новых свойств, из них только 2 являются индексами

Автор: Diesel Draft 18.7.2007, 17:05
Да я уже понял в чем ошибка. Раньше я создавал и сразу читал по текстовому ключу. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)