Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2008, 11:08
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

клонирование
Нашел скрипт в сети для клонирования объекта.
Object.prototype.clone = function() {
	var f = function () {};
	f.prototype = this;
	var g = new f();
	g.prototype = this;
	return g;
}

var man = { name: "asdf", age: 21, sayHello: function () { alert("Hello, World!!!"); } };

var me = man.clone();

alert(me.name + " is " + me.age + " year old!");

me.sayHello();

не вижу разницы если метод clone переписать таким образом
Object.prototype.clone = function() {
	return this;
}
все работает так же. Или есть разница?
Ответить с цитированием
  #2 (permalink)  
Старый 30.11.2008, 12:31
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

В первом случае два разных объекта, во втором случае один и тот же.
Ответить с цитированием
  #3 (permalink)  
Старый 30.11.2008, 13:04
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

зачем создавать другой объект, когда можно просто передать, все методы и свойства одного объекта другому?
Ответить с цитированием
  #4 (permalink)  
Старый 30.11.2008, 13:29
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от HelpeR
зачем создавать другой объект, когда можно просто передать, все методы и свойства одного объекта другому?
Как можно что-то передать другому, если нет этого другого?
Ответить с цитированием
  #5 (permalink)  
Старый 30.11.2008, 13:39
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

что то не так уж доходит )) я понял что в первом случае создается новый объект которому передаются все методы и св-ва и который потом присваевается переменной. var me = man.clone(); Т.е. me это полностью новый объект с копироваными свойствами и методами другого объекта. (это все при Object.prototype.clone = function() {
var f = function () {};
f.prototype = this;
var g = new f();
g.prototype = this;
return g;
}
а что происходит если переписать метод на return this; ???
Ответить с цитированием
  #6 (permalink)  
Старый 30.11.2008, 13:50
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Это не клонирование, а скорее наследование на прототипах, и повторная инициализация прототипа там лишняя, функцию можно переписать так:
Object.prototype.clone = function() {
    function F() {};
    F.prototype = this;
    return new F();
};

Здесь используется тот факт, что пока на объект существует хотя бы одна ссылка, он остается в памяти. Так в этом коде ссылка на объект остается в прототипе нового объекта.
Получается что-то вроде инициализации прототипа таким образом:
function F() {}
F.prototype = {
   attribute1: …,
   attribute2: …,
   attribute3: …,
   method1: …,
   method2: …,
   method3: …
};

Вообще эта конструкция не реализует то, что хотелось бы понимать под клонированием объекта:
var obj1 = {a: 0};
var obj2 = obj1.clone();
obj1.a = 1;
alert(obj2.a); // выдаст 1

Последний раз редактировалось Octane, 30.11.2008 в 14:00.
Ответить с цитированием
  #7 (permalink)  
Старый 30.11.2008, 14:04
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от HelpeR
а что происходит если переписать метод на return this; ???
Функция возвращает тот же самый объект. В итоге мы имеем 2 переменные (man, me) и 1 объект, на который эти переменные "смотрят".
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2008, 20:41
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

Цитата:
Вообще эта конструкция не реализует то, что хотелось бы понимать под клонированием объекта:
А как переписать эту функцию, что бы был полностью не зависимый клон. Если не ошибаюсь кажется надо использоваться замыкание, которое описывалось в набле на дклабе
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2008, 20:55
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от HelpeR Посмотреть сообщение
А как переписать эту функцию, что бы был полностью не зависимый клон.
Никак

Универсального способа нет. Например, чтобы скопировать все атрибуты и методы объекта, можно написать такую функцию:
Object.prototype.clone = function() {
   var key, obj = {};
   for(key in this) if(this.hasOwnProperty(key)) obj[key] = this[key];
   return obj;
};

Прототип встроенной функции-конструктора Object конечно лучше не трогать, если там еще нет пользовательских методов:
function cloneObject(obj) {
   var key, clone = {};
   for(key in obj) if(obj.hasOwnProperty(key)) clone[key] = obj[key];
   return clone;
}
Ответить с цитированием
  #10 (permalink)  
Старый 02.12.2008, 21:06
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

var obj1 = {a: 0};
var obj2 = obj1.clone();
obj1.a = 1;
alert(obj2.a); // выдаст 1
я не как не пойму, почему он должен выдать 1, ведь все методы копируются а не ссылаются
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое клонирование поля и AJAX supercelt AJAX и COMET 6 02.09.2008 11:27