克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));
被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));
但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我在javascript中分配对象时遇到了一些问题.
看看这个重现我的问题的示例代码.
var fruit = {
name: "Apple"
};
var vegetable = fruit;
vegetable.name = "potatoe";
console.log(fruit);
Run Code Online (Sandbox Code Playgroud)
它记录
Object {name: "potatoe"}
Run Code Online (Sandbox Code Playgroud)
如何将值而不是对象的引用分配给另一个对象?
我试图在Javascript中克隆一个对象.我已经创建了自己的"类",它具有原型功能.
我的问题:当我克隆一个对象时,克隆无法访问/调用任何原型函数.
当我去访问克隆的原型函数时,我收到一个错误:
clone.render不是一个函数
你能告诉我如何克隆一个对象并保持其原型功能
这个简单的JSFiddle演示了我得到的错误:http://jsfiddle.net/VHEFb/1/
function cloneObject(obj)
{
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
var copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
var copy = [];
for (var i = 0, len = obj.length; i < len; ++i) {
copy[i] = cloneObject(obj[i]);
} …
Run Code Online (Sandbox Code Playgroud) 脚本
读完这个答案后,我意识到我可以从JSON文字开始创建对象.
所以我猜我只能使用这个有用的JSON方法做相反的事情:
JSON.stringify(myObject)
.
所以我做了如下:
function MyObject(id, value, desc)
{
this.id = id;
this.value = value;
this.desc = desc;
this.toJSON = function()
{
return JSON.stringify(this);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个东西(演示)Maximum call stack size exceeded
时会发生错误.
谷歌搜索后,我发现两个引用解释了这种行为:
如果我做对了,就会.toJSON
超越.stringify
.因此,如果第一个调用第二个,则生成循环.
问题
toJSON
是一种保留的特殊关键字?.toJSON
名称更改为的stackoverflow错误.display
.不那么优雅.还有其他解决方案吗?我有一个对象数组.我想深度复制对象数组并对每个对象进行一些更改.我想这样做而不修改原始数组或该数组中的原始对象.
这就是我做的方式.但是,作为JavaScript的新手,我想确保这是一个很好的方法.
有一个更好的方法吗?
const users =
[
{
id : 1,
name : 'Jack',
approved : false
},
{
id : 2,
name : 'Bill',
approved : true
},
{
id : 3,
name : 'Rick',
approved : false
},
{
id : 4,
name : 'Rick',
approved : true
}
];
const users2 =
users
.map(
(u) =>
{
return Object.assign({}, u);
}
)
.map(
(u) =>
{
u.approved = true;
return u;
}
);
console.log('New users2 array of …
Run Code Online (Sandbox Code Playgroud)