Показать сообщение отдельно
  #17 (permalink)  
Старый 01.05.2011, 17:13
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

Статью конечно посмотрел, и я тоже считаю что это самый правильный вариант, я этим часто пользуюсь - и просто и красиво, да еще и удобно, и код читается легко и так далее..
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;
}

Надеюсь не накосячил в коде почти не тестил
__________________
readOnly

Последний раз редактировалось poorking, 01.05.2011 в 17:28.
Ответить с цитированием