在Javascript中,是否可以告诉一个对象停止对另一个对象的引用行为

在Javascript中,是否可以告诉一个对象停止对另一个对象的引用行为,javascript,Javascript,只是重新开始大量使用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(ob

只是重新开始大量使用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

提前thx

您不能告诉对象停止引用行为。这就是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()
函数的代码。按照该链接搜索
fn.extend

您不能告诉对象停止引用行为。这就是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()
函数的代码。按照该链接搜索
fn.extend

你的意思是,如何克隆对象?不,我希望在开始时参考行为,但之后能够告诉它停止。我查看了克隆答案,但希望在开始时引用行为,然后在执行此操作时断开连接:
var objB=objA你只得到一个对象;它是一个对象,有两个独立的变量指向它。JavaScript中没有“惰性克隆”机制。@timpone那么你的意思是,以后如何克隆对象?或者,您需要两个临时镜像彼此状态的对象?后者。基本上创建一个引用关系,然后在以后的某个时候,能够断开该关系。我想下面的答案就是,我们不能用Javascript这样做真正的metraprogramming(也许是其他方式)你的意思是,如何克隆一个对象?不,我希望在开始时使用引用行为,但之后能够告诉它停止。我查看了克隆答案,但希望在开始时引用行为,然后在执行此操作时断开连接:
var objB=objA你只得到一个对象;它是一个对象,有两个独立的变量指向它。JavaScript中没有“惰性克隆”机制。@timpone那么你的意思是,以后如何克隆对象?或者,您需要两个临时镜像彼此状态的对象?后者。基本上创建一个引用关系,然后在以后的某个时候,能够断开该关系。我认为下面的答案是,我们不能用Javascript真正地进行metraprogramming,这种方式(可能是其他方式)不仅仅是“简单地迭代属性”,如果属性本身是对象或对象数组,则需要递归。太糟糕了,没有简单通用的方法来制作任何对象的深度副本。@Christophe-这就是为什么那句话说“浅层副本”。请注意,如果
arr
是实数组,那么
arr.slice(0)
也可以。@JanDvorak-是的,我习惯这样做,因此它可以在偶尔出现的各种伪数组上工作(例如从DOM调用返回的集合或
参数
伪数组),如果属性本身是对象或对象数组,则需要递归。太糟糕了,没有简单通用的方法来制作任何对象的深度副本。@Christophe-这就是为什么那句话说“浅层副本”。请注意,如果
arr
是实数组,那么
arr.slice(0)
也可以。@JanDvorak-是的,我习惯于这样做,因此它可以处理偶尔出现的各种伪数组(例如从DOM调用返回的集合或
参数
伪数组)。