jQuery.extend не ожидает, что вы будете использовать оператор instanceof. Он делает великолепно сложную копию, а не настоящий клон. Цикл по элементам не достаточно. Кроме того, вызов конструктора не лучший, потому что вы потеряете свои аргументы. Попробуйте это:
var MyClass = function(param1, param2) {
alert(param1.a + param2.a);
this.p1 = param1;
this.p2 = param2;
};
function Clone() { }
function clone(obj) {
Clone.prototype = obj;
return new Clone();
}
var myObj = new MyClass({a: 1},{a: 2});
var myObjClone = clone(myObj);
alert(myObj instanceof MyClass); // => true
alert(myObjClone instanceof MyClass); // => true
console.log(myObj); //note they are
console.log(myObjClone) //exactly the same
Имейте в виду, что, поскольку ваш прототип теперь указывает на оригинал (myObj), любые изменения в myObj будут отражаться в myObjClone. Наследование прототипов Javascript довольно сложно. Вы должны быть уверены, что ваш новый объект имеет правильный прототип и, следовательно, правильный конструктор.
По общему признанию, Javascript заставляет мою голову болеть. Тем не менее, я думаю, что я правильно читаю из спецификации языка ECMAScript :
13.2.2 [[Construct]]
Когда внутренний метод [[Construct]] для объекта Function F вызывается с возможно пустым списком аргументов, предпринимаются следующие шаги:
- Пусть obj будет вновь созданным собственным объектом ECMAScript.
- Установите все внутренние методы obj, как указано в 8.12.
- Установите для внутреннего свойства [[Class]] объекта obj значение "Object".
- Установите для внутреннего свойства [[Extensible]] объекта obj значение true.
- Пусть proto будет значением вызова внутреннего свойства [[Get]] для F с аргументом> "prototype".
- Если тип (proto) равен Object, установите для внутреннего свойства [[Prototype]] объекта obj значение proto.
- Если Type (proto) не является Object, установите для внутреннего свойства [[Prototype]] объекта obj значение> стандартного встроенного объекта-прототипа Object, как описано в 15.2.4.
- Пусть result будет результатом вызова внутреннего свойства [[Call]] для F, предоставив> obj в качестве значения this и предоставив список аргументов, переданный в [[Construct]] в качестве аргументов.
- Если тип (результат) равен объекту, вернуть результат.
- Возвратите объект.
Этот человек , кажется, понимает эту концепцию намного лучше, чем я. К, я возвращаюсь в Яву сейчас, где я плаваю больше, чем тону :).