【问题标题】:is it possible in Javascript to tell an object to stop having reference behavior with another object是否可以在 Javascript 中告诉一个对象停止对另一个对象的引用行为
【发布时间】:2013-01-21 18:29:58
【问题描述】:

刚刚重新开始大量使用 Javascript 并尝试更好地理解 Javascript 对象。我之前问过上一个问题,但这个问题不同。我可以断开对象之间存在的引用关系吗?

例如:

var objA={};
objA.my_name='Joe';
var objB=objA;
objB.my_name="jake"; // objA.my_name="jake"
objB.something="this is something";
objA.last_name="Jackson";
console.log(objA.something);  // "this si something" can add to parent object at runtime
console.log(objB.last_name);  // "Jackson" can add to child object at runtime
// now I'd like to cut off objB from objA such that:
objB.cell_phone='323-213-2323';
console.log(objA.cell_phone); // '323-213-2323' but would like undefined; would like this behavior

提前谢谢

【问题讨论】:

  • 你的意思是,如何克隆一个对象?
  • 不,我想在开始时参考行为,但随后能够告诉它停止。我查看了克隆答案,但希望在开始时参考行为,然后断开连接
  • 当你这样做时:var objB = objA; 你最终只有一个对象;它是一个对象,有两个单独的变量指向它。 JavaScript 中没有“惰性克隆”机制。
  • @timpone 所以你的意思是,以后如何克隆一个对象?或者,您想要两个对象临时反映彼此的状态?
  • 后者。基本上创建一个参考关系,然后,在稍后的时间点,能够断开关系。我认为下面的答案就是我们不能以这种方式在 Javascript 中进行真正的元编程(也许是其他方式)

标签: javascript


【解决方案1】:

你不能告诉一个对象停止引用行为。这就是 javascript 的工作方式。

您可以复制一个对象,以便创建一个与原始对象具有相同属性的全新对象,但它是一个完全独立的对象,不具有引用行为。

可以通过简单地迭代对象的属性并将每个属性分配给一个新对象来制作浅拷贝。

function shallowCopy(src, dest) {
    for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            dest[prop] = src[prop];
        }
    }
} 

数组的浅拷贝可以这样完成:

var arr = [1,2,3];
var copyArr = [].slice.call(arr, 0);

作为对象或数组本身的属性也被复制的深拷贝需要更多的工作,因为您基本上必须检查它们是否是对象或数组,然后递归地复制它们及其内容。如此处所示的浅拷贝要容易得多,而且如果您知道数据的内容通常就足够了。


如果想看高级版的复制(包括深复制),可以看jQuery的.extend()函数here的代码。按照该链接搜索fn.extend

【讨论】:

  • 如果属性本身是需要递归的对象或对象数组,这不仅仅是“简单地迭代属性”。
  • 太糟糕了,没有简单通用的方法来制作任何对象的深层副本。
  • @Christophe - 这就是为什么那句话说“浅拷贝”。
  • 请注意,如果arr 是一个真正的数组,那么arr.slice(0) 也可以。
  • @JanDvorak - 是的,我习惯这样做,因此它适用于偶尔出现的各种伪数组(例如从 DOM 调用返回的集合或 arguments 伪-数组)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2023-03-03
  • 1970-01-01
  • 2012-11-25
相关资源
最近更新 更多