Статью конечно посмотрел, и я тоже считаю что это самый правильный вариант, я этим часто пользуюсь - и просто и красиво, да еще и удобно, и код читается легко и так далее..
Object.prototype.set = function(props){
for(var any in props) if(props.hasOwnProperty(any)){
if(typeof props[any] === "object" && !props[any] instanceof Array){
if(!this[any]){
this[any] = {};
}
this[any].set(props[any]);
}else{
this[any] = props[any];
}
}
//для удобства
return this;
}
var a = {}.set({codename: "red", value: 5, style: {color: "red", border: "1px solid red"}, fields: [1,2,3,4,5,6,7,8]});
//смотреть в FF
alert(a.toSource());
a.set({some: true});
alert(a.toSource());
Очень удобно, кто не любит расширять прототипы родных классов, в эту функцию можно передавать самого виновника
А еще лучше так чтобы если массив передаем в качестве устанавливаемого значение, чтобы не ссылка его устанавливалась а копия, если например набор параметров един, но изменяется по ходу кода
Array.prototype.copy = function(){
var len = this.length, nuarr = [];
for(var i = 0; i < len; i ++){
if(i in this){
if(typeof this[i] === "object" && !this[i] instanceof Array){
nuarr[i] = {}.set(this[i]);
}else if(this[i] instanceof Array){
nuarr[i] = this[i].copy();
}else{
nuarr[i] = this[i];
}
}
}
return nuarr;
}
Object.prototype.set = function(props){
for(var any in props) if(props.hasOwnProperty(any)){
if(typeof props[any] === "object" && !props[any] instanceof Array){
if(!this[any]){
this[any] = {};
}
this[any].set(props[any]);
}else if(props[any] instanceof Array){
this[any] = props[any].copy();
}else{
this[any] = props[any];
}
}
//для удобства
return this;
}
Надеюсь не накосячил в коде почти не тестил