Ну фабричную функцию можно использовать и как конструктор, хотя смысла в этом особого и нет.) Можно даже навешать на элемент дополнительные свойства, но... см. выше.)
function Menu(options){
function liToString(){
return this.innerText || this.textContent;
}
var d = document,
_ul = document.createElement('ul'),
_items = options.items || [],
_itemsCount = options.itemsCount || _items.length;
;
for(var i = 0; i<_itemsCount; i++){
_ul[i] = _ul.appendChild(d.createElement('li'));
_ul[i].appendChild(d.createTextNode(_items[i] || 'default'));
_ul[i].toString = liToString;
}
_ul.length = _itemsCount;
return _ul
};
var menu = new Menu({ //new тут никакой роли не играет =\
items : ['1','два',3],
itemsCount : 10
})
document.body.appendChild(menu)
alert([
menu,
menu[1],
menu.length
].join('\n'))
P.S. С новомодным Proxy кстати можно такое творить... будет через годик другой.