Во первых, если вы используете именно функцию, то вам необходимо проверять в ней тип элемента, если массив перебирать циклом!
Для лучшего понимания советую вам посмотреть исходник функции addClass в библиотеке jquery, там в принципе все понятно.
Вот мой вариант, немного переписаный, но основанный именно на addClass в jquery:
Array.isArray = function(obj) {
return /^\[object (NodeList|Array)\]$/.test(Object.prototype.toString.call(obj));
};
Document.prototype.addClass =
DocumentFragment.prototype.addClass =
NodeList.prototype.addClass =
Element.prototype.addClass = function(value) {
if( typeof value === "string" && value ) {
var j, current, clazz, finalValue;
var stripAndCollapse = function(v, a) {
var tokens = v.match(/[^\x20\t\r\n\f]+/g) || [];
return a ? tokens : tokens.join(" ");
}, classList = stripAndCollapse(value, true);
var list; Array.isArray(this) ? (list = this) : (list = [], list.push(this));
list.forEach(function(elem, i) {
// This expression is here for better compressibility (see addClass)
current = elem.nodeType === 1 && (" " + stripAndCollapse(elem.className) + " ");
if( current ) {
j = 0;
while( (clazz = classList[j++]) ) {
if( current.indexOf(" " + clazz + " ") < 0 ) {
current += clazz + " ";
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse(current);
if( finalValue !== elem.className ) {
elem.setAttribute("class", finalValue);
}
}
});
}
return this;
};