带有KnockoutJS可观察属性的JavaScript克隆对象
JavaScript clone object with KnockoutJS observable properties
我有一个混合的KnockoutJS可观察对象和标准属性:
var original = {
a: ko.observable("a"),
b: "b"
};
我想创建一个没有任何引用的original
对象的克隆,这样我就可以做:
var cloned = clone(original);
cloned.a("a cloned");
original.a(); //-> "a" ERROR HERE
original.a("a original");
cloned.a(); //-> "a cloned" ERROR HERE
和
cloned.b = "b cloned";
original.b //-> "b" OK
original.b = "b original";
cloned.b //-> "b cloned" OK
我已经尝试过这个函数,但它导致KnockoutJS的可观察属性被复制,而不是克隆:
cloneObj = function(obj){
if(obj === null || typeof obj !== 'object')
return obj;
var temp = obj.constructor(); // Give temp the original obj's constructor
for (var key in obj) {
temp[key] = cloneObj(obj[key]);
}
return temp;
};
你可以看到在这个提琴http://jsfiddle.net/Ep3jY/问题只发生在KnockoutJS的可观察属性,而正常的JavaScript属性克隆正确。
现在我用一个函数返回对象,但这很烦人:
function(){
return {
a: ko.observable("a");
};
}
好吧,似乎问题是与KnockoutJS的可观察对象。我是这样解决的:
cloneObj = function(obj){
if(ko.isWriteableObservable(obj))
return ko.observable(obj()); // This is the trick
if(obj === null || typeof obj !== 'object')
return obj;
var temp = obj.constructor(); // Give temp the original obj's constructor
for (var key in obj) {
temp[key] = cloneObj(obj[key]);
}
return temp;
};
相关文章:
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值