JavaScript中基于某些父代属性名称的“动态”对象引用是否可能?

时间:2019-04-19 04:12:10

标签: javascript pointers reference

很确定这是重复的,但我真的不知道要搜索什么。所以请忍受...

在下面的示例中,childRef指向分配给someParentObj.someChildObj的原始对象,因此,当someParentObj.someChildObj附属于新对象时,childRef仍引用原始对象。

是否有一种分配childRef的方法,以便一旦将新对象分配给someParentObj.someChildObj就会反映出来? (我主要是出于好奇而问这个问题,但在某些情况下,它可能允许较短的代码并派上用场。)

var someParentObj = {
    someChildObj: {originalChildProp: ['some', 'array']}
};

window.parentRef = someParentObj;
window.childRef = someParentObj.someChildObj;

someParentObj.someChildObj = {differentChildProp: ['other', 'array']}


console.log(parentRef.someChildObj)
// Output: {differentChildProp: Array(2)}

console.log(childRef) 
// Output: {originalChildProp: Array(2)} but I would like to have the new/different
// object on parentRef.someChildObj. Is it possible?

1 个答案:

答案 0 :(得分:2)

在您要分配给window的属性的情况下,在特定情况下 可以使用的一个选项是使window.childRef成为 getter em>返回someParentObj.someChildObj

var someParentObj = {
    someChildObj: {originalChildProp: ['some', 'array']}
};

window.parentRef = someParentObj;
Object.defineProperty(window, 'childRef', { get() { return someParentObj.someChildObj }});

someParentObj.someChildObj = {differentChildProp: ['other', 'array']}

console.log(parentRef.someChildObj)
console.log(childRef)

如果您分配给对象的属性,例如childRef是一个不在全局对象上的独立的块范围变量,那么这是不可能的。因此,如果要使用这种模式,请始终使用对象。

如果您可以操纵基础对象引用(例如,如果您不使用window),则也可以使用代理服务器,它可以完成基本相同的操作,但是更加复杂且受支持较少。