Вот «более симпатичная» версия (без eval, без глобальных, формальных аргументов, без нечеткого кода внутри строк) того, что вам нужно, не устанавливая его в прототипе, потому что это не работает для IE.
/**
* Sets a property on each of the elements in the list
* @param {NodeList} list
* @param {string} prop The name of property to be set,
* e.g., 'style.backgroundColor', 'value'.
* @param {mixed} value what to set the value to
*/
function setListProp( list, prop, value) {
for (var i = 0; i < list.length; i++) {
setProp(list[i], prop, value);
}
}
/**
* Avoids the use of eval to set properties that may contain dots
* Why avoid eval? eval is slow and could be dangerous if input comes from
* an unsanitized source
* @param {object} el object that will have its property set
* @param {string} propName ('value', 'style.backgroundColor')
* Example: setProp(node, 'style.backgroundColor', "#ddd");
*/
function setProp(el, propName, value) {
var propList = propName.split('.');
// Note we're not setting it to the last value in the property chain
for (var i=0; i < propList.length - 1 ; i++) {
el = el[propList[i]];
}
var lastProperty = propList[propList.length -1];
el[lastProperty] = value;
}
Контрольный пример
Перейдите на google.com с помощью Firefox, введите приведенный выше код в консоль и введите следующее:
// Set tooltip on links
setListProp( document.getElementsByTagName('a'), 'title', 'YEAH it worked');
// Set bg to red on all links
setListProp( document.getElementsByTagName('a'), 'style.backgroundColor', '#f00');
UPDATE
Мое решение не сработает, если вы захотите сделать + =, как вы упомянули. Я думаю, что самое элегантное решение - использовать цикл обратного вызова, подобный следующему.
/**
* This exists in many libs and in newer versions of JS on Array's prototype
* @param {Object[]} arr The array that we want to act on each element.
* Does not work for sparse arrays
* @param {Function} callback The function to be called for each element, it will be passed
* the element as its first argument, the index as the secibd
*/
function iterate(arr, callback) {
for (var i=0,item; item=arr[i]; i++) {
callback(item, i);
}
}
Тогда вы можете назвать это так
var as = document.getElementsByTagName('a');
iterate( as, function(el, index) {
el.style.backgroundColor = 'red';
el.innerHTML += "Whatever";
});