клонирование
Нашел скрипт в сети для клонирования объекта.
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;
}
все работает так же. Или есть разница? |
В первом случае два разных объекта, во втором случае один и тот же.
|
зачем создавать другой объект, когда можно просто передать, все методы и свойства одного объекта другому?
|
Цитата:
|
что то не так уж доходит )) я понял что в первом случае создается новый объект которому передаются все методы и св-ва и который потом присваевается переменной. 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; ??? |
Это не клонирование, а скорее наследование на прототипах, и повторная инициализация прототипа там лишняя, функцию можно переписать так:
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
|
Цитата:
|
Цитата:
|
Цитата:
Универсального способа нет. Например, чтобы скопировать все атрибуты и методы объекта, можно написать такую функцию:
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;
}
|
var obj1 = {a: 0};
var obj2 = obj1.clone();
obj1.a = 1;
alert(obj2.a); // выдаст 1
я не как не пойму, почему он должен выдать 1, ведь все методы копируются а не ссылаются |
| Часовой пояс GMT +3, время: 21:53. |