我知道$.extend
,这几乎可以满足我的需要,但它似乎也在解开'原型,通过将所有方法复制为新对象的成员。有没有办法告诉它跳过继承的成员,还是我必须自己复制复制函数?
这是我目前所拥有的,但我不确定它是否可以改进:
function Foo() {
this.x = 3;
this.y = {a: 4};
}
Foo.prototype.z = 5;
Foo.prototype.clone = function() {
var res = new Foo();
for (var key in this) {
if (this.hasOwnProperty(key)) {
// assuming that all members are plain values or objects/arrays
if (this[key] instanceof Array) {
res[key] = $.extend(true, [], this[key]);
} else if (this[key] instanceof Object) {
res[key] = $.extend(true, {}, this[key]);
} else {
res[key] = this[key];
}
}
}
return res;
};
var foo = new Foo();
var bar1 = $.extend(true, {}, foo); // {x: 3, y: {a: 4}, z: 5, clone: function}
var bar2 = foo.clone(); // {x: 3, y: {a: 4}}
更新:查看$.extend
实施情况,除了hasOwnProperty
检查外,它看起来与我的非常相似,所以也许这是最好的方法所有?