Your comments

Я использую "глобальный" массив типа

events[port][channel]

В глобальном слушателе идет проверка

if (events[port][channel]!==undefined) events[port][channel].Event(parseInt(value));

Элементами массива являются ссылки на объекты с необходимыми функциями

инициализация вида

buttons[1]=new BtnElement({Txt: "Вход", Color: 1, Port: 1, Channel: 123);
var BtnElement = function(o)
{
    this.Name=o.Txt;
    this.Color=o.Color;
    this.Object=test_list.CreateItem( .. //Clone( ..
    events[o.Port][o.Channel]=this; //events[o.Port] === Array
    IR.AddListener(IR.EVENT_ITEM_PRESS, this.Object, this.Do, this);
};
//BtnElement.constructor = function1
BtnElement.prototype.Event = function(value) 
{
    this.Object.Text = (value) ?  "Yes" : "No";
    ...
};
BtnElement.prototype.Do = function() 
{
    this.Object.Text="Yepp!";
    this.OtherObject.Color=this.Color;
    ...
};

В вашем примере для массива наверно можно использовать индексы Item, Subitem

Правой кнопкой по команде/фидбеку "Show Sequence".

Есть "особенности", особенно при работе совместно с предопределенными командами/фидбэками..

IR.AddListener(IR.EVENT_START,0,function()
{
IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{
     IR.Log("Global Listener Activated: " + name + "\tValue: " + value);
});

var item,i=0;
var obj  = IR.GetItem("Page 1").GetItem("Item 1")

for (;i<1500;i++){
    item=obj.Clone("button_"+i);
    item.X=obj.X+i/3;
    item.Y=obj.Y+i/3;
    IR.SubscribeTagChange("UI.Page 1."+item.Name+".Value");  
}
});
var item,i=0;

IR.Log("ItemsCount: " + IR.GetItem("Page 1").ItemsCount);


while (item=IR.GetItem("Page 1").GetItem(i)){
   IR.AddListener(IR.EVENT_ITEM_PRESS, item, Item_Press, item);
   i++;
}




function Item_Press(){
   IR.Log("Name: " + this.Name + " Type: " + this.Type);   
}