我创建了一个具有一系列属性的Javscript原型对象。我需要将其中一些属性传递给函数。该函数处理属性并返回一些结果。
function ObjCt(id,data) {
this.id = id;
this.data = data;
}
所以,我正在尝试将图表对象的数据传递给函数。我称之为:
var obj=new ObjCt(id,data);
process(obj.id,obj.data);
我从某处读到,在JS中传递值会导致按值调用,并且传递对象会导致按引用调用。在这里,我试图通过值调用,但是,似乎process()
函数中发生的任何处理都反映在对象obj
中。
我使用typeof
检查了过程函数中收到的变量,它出现为'对象'而不是变量。那么,我该怎么做才能将这些数据作为值传递?
修改
我发现了一个相当无聊的解决方法。 id
是原始的,data
是JSON对象。所以,我在process()
函数
JSON.parse(JSON.stringify(data))
显然,所有参考文献都在这里被删减了。我现在有一个工作实现,但是,我仍然希望看到是否有一种更简单的方法将属性作为值传递。
修改
解决了这个问题。根据Paul的回答,尝试了一步一步的正常克隆和另一种使用jquery扩展方法的替代方法,就像这样
var object=$.extend(true,{},oldObject);
并将新创建的对象传递给process()
函数。
请参阅此链接:What is the most efficient way to deep clone an object in JavaScript?
答案 0 :(得分:2)
在 JavaScript 中,原语( Number,String )传递 ByVal 和 Objects (包括数组,函数)传递 ByRef 。
大多数情况下这没有任何区别,但是在使用修改 Object 的方法时可能会遇到问题,而不考虑您在其他地方也可能需要它。
为了解决这个问题,clone
你的对象,然后再将其传递给这样的方法。
数组具有要克隆的本机Array.prototype.slice
,对于 Objects ,您需要循环键并对属性进行递归。
要克隆的自定义功能,允许您通过instanceof
测试扩展它以执行更多对象
function clone(o) {
var o2 = {}, k;
if (typeof o !== 'object')
return o;
if (o instanceof Array)
return o.slice().map(clone);
if (o instanceof Date)
return new Date(o);
for (k in o)
if (Object.prototype.hasOwnProperty.call(o, k))
o2[k] = clone(o[k]);
return o2;
}
通过 JSON 克隆,只支持可以用 JSON 编写的内容
function clone(o) {
return JSON.parse(JSON.stringify(o));
}
假装使用继承进行克隆
不会保护foo.bar.baz = primitive
,但会保护foo.bar = primitive
,因此对您的选择有多好取决于 Object < / em>看起来像或正在做什么。
function pseudoclone(o) {
return Object.create(o);
}
不要尝试克隆功能,它会发生可怕的错误。如果您需要以某种方式修改它们,请将它们包装起来。
答案 1 :(得分:0)
你是否只接受这种方法?
var Chart=function(id,data){
this.ObjCt = function () {
this.id = id;
this.data = data;
}
}
然后
var obj=new Chart(id,data);
obj.ObjCt();
//process(obj.id,obj.data);
答案 2 :(得分:0)
假设id
是原始的,data
是一个对象:
function ObjCt(id, data){
this.id = id;
this.data = eval(data.toSource());
}
这将使用简单的技巧克隆data
中保存的对象。