У тебя неверная "архитектура".
Поскольку с массивом items предполагается работа из нескольких функций, значит один единственный экземпляр должен быть доступен для работы во всех функциях. Для этого нужно сделать его глобальным. т.е. объявить так
window.items = [];
Всякий раз, когда ты так или иначе добавляешь элемент, ты должен писать
window.items.push(new product(/*Здесь все параметры нового продукта*/));
или
window.items[window.items.length - 1] = new product(/*Здесь все параметры нового продукта*/);
Во всех функциях (сортировка и т.д.) также обращаешься к глобальному массиву window.items.
Теперь про форму добавления. От тега FORM для удобства (и чтобы он не смущал особенностями своей работы) лучше отказаться. Задай строке TR с полями ввода некоторый id, например id="FORM_NEW_PRODUCT". Каждому полю ввода в этой форме задай атрибут name, соответствующий назначению поля, например name= name, pict, description, price. Сделай простую кнопку (не submit), на нажатие которой повесь функцию типа:
function aggregateData(){
var data = {};
$('#FORM_NEW_PRODUCT').find('input,select').each(function(){
var name = $(this).attr('name');
name && (data[name] = $(this).val());
});
window.items.push(new product(data));
$('#FORM_NEW_PRODUCT').remove();/*Удаляем строку за ненадобностью*/
/*Здесь можешь также передать полученный data в функцию, которая добавит строку с полученными данными о новом продукте в таблицу*/
}
а функцию product() переделай вот так:
function product (params) {
if (params && typeof params === typeof {}) {
for (var key in params) {
this[key] = params[key];
}
}
return this;
}
Учись использовать JQuery - даже Яндекс его использует.
Для общего развития почитай о вреде глобальных переменных и пользе пространств имен.