javascript - 将嵌套对象更改为同一个对象,其值是对象是父对象为原型(prototype)的对象

标签 javascript prototype-chain

试验一个想法。给定一个对象,如:

T = {
  a: 2,
  b: 9,
  c: {
    a: 3,
    d: 6,
    e: {
      f: 12
    }
  }
}

我想改变它,使作为对象的每个值都更改为同一个对象,并以父对象为原型(prototype)。

意思是我希望能够有以下输出:

> T.c.b
9
> T.c.e.b
9
> T.c.e.a
3
> T.c.c.c
{a: 3, d: 6, e:[Object]}

我已经创建了以下几乎按预期工作的函数:

function chainer(object) {
    for (const key in object) {
        if (object[key] !== null && typeof (object[key]) === 'object') {
            let Constructor = function () {
            };
            Constructor.prototype = object;
            let objectValue = {...object[key]};
            object[key] = new Constructor();
            for (const savedKey in objectValue) {
                object[key][savedKey] = objectValue[savedKey];
            }
        }
    }
}

function chain(object) {
    chainer(object);
    for (const key in object) {
        if (object[key] !== null && typeof (object[key]) === 'object') {
            chainer(object[key]);
        }
    }
}

对于前面的示例,它按预期工作。不过,当我尝试以下操作时:

T = {a:4, g:{g:{g:{g:{g:{g:{g:{}}}}}}}}

出现以下输出:

> T.a
4
> T.g.a
4
> T.g.g.a
4
> T.g.g.g.a
undefined
> T.g.g.g.g.a
undefined

我觉得这很奇怪,它只能在一定程度上起作用,这让我觉得这可能是一个我不知道的限制问题。

无论如何,我头晕目眩,没有想法,有什么想法吗?

最佳答案

这似乎工作正常:

ouroboros = (x, parent = null) => {
    if (!x || typeof x !== 'object')
        return x;
    let r = Object.create(parent);
    Object.entries(x).forEach(([k, v]) => r[k] = ouroboros(v, r));
    return r;
};

//


T = ouroboros({x: 4, a: {b: {c: {d: {e: {}}}}}});
console.log(T.a.b.c.a.b.c.a.b.c.a.b.c.a.b.c.x);

或者,改变对象,而不是复制:

ouroboros = (x, parent = null) => {
    if (x && typeof x === 'object') {
        Object.setPrototypeOf(x, parent);
        Object.values(x).forEach(v => ouroboros(v, x));
    }
};

关于javascript - 将嵌套对象更改为同一个对象,其值是对象是父对象为原型(prototype)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483150/

相关文章:

javascript - 如何测试默认的 props 函数是否附加到组件? | react |开 Jest | enzyme

javascript - 原型(prototype)链 : call "super" method over multiple levels

javascript - 如何从新的 iframe 重置损坏的 JavaScript 数组对象?

Javascript: Canvas 绘图(2 个相同的文件,但结果不同)

javascript - "The"原型(prototype)是什么?

javascript - 函数如何通过 [[FunctionLocation]] 到达外部脚本?

javascript - 为什么我会收到 ReferrenceError : BinaryFile is not Defined

javascript - 如何绑定(bind)点击触发器,只绑定(bind)到点击的元素?

javascript - 可以使用 Backbone 模型的 cid 作为 html id 属性吗?它保证是唯一的吗?