在传播对象时使用“this”关键字

Use 'this' keyword while spreading an object

提问人:Karolina Hudziec 提问时间:1/28/2023 更新时间:7/2/2023 访问量:69

问:

我有一个不寻常的问题。我试图实现的是修改对象的属性,同时通过方法进行传播。例

const obj1 = {
    prop1: "value1",
    prop2: function() {
        this.prop1 = 10
        return "value2"
    }
}
const obj2 = {
    ...obj1,
    prop2: obj1.prop2()
}

现在,我希望 obj2 看起来像这样:

{
    prop1: 10,
    prop2: "value2"
}

但是由于这个范围,只有 obj1 中的 prop1 发生了变化,obj2 看起来像这样:

{
    prop1: "value1",
    prop2: "value2"
}

我知道我可以在之后直接更改 obj1.prop1,但问题是代码的第二部分(obj2 初始化)在我的项目使用的包之一中,并且不想修改它。我唯一控制的是我进一步传递的 obj1。有没有办法在不修改软件包源代码的情况下做到这一点?

JavaScript 对象 这个 克隆

评论

1赞 Daniel A. White 1/28/2023
仅供参考,这样做似乎使代码难以阅读
2赞 Alex 1/28/2023
这是不可能的,每次你无法避免时,spread 关键字都会删除同名的密钥。你将不得不进行事后治疗(正如@DanielA.White所说,这将更具可读性)
1赞 Sebastian Simon 1/28/2023
相关:如果一个变量是根据另一个变量定义的,它能否反映另一个变量绑定的变化?如果在某处使用(显式或隐式),则将使用其原始 String 值,并且基元值与其来源之间没有链接。obj.prop1
2赞 epascarello 1/28/2023
试图找到你需要这样做的原因

答:

0赞 obe 1/28/2023 #1

您可以通过将初始化更改为以下内容来实现它:obj2

const obj2 = {
    prop2: obj1.prop2(),
    ...obj1,
    prop2: obj1.prop2(),
}

但就像评论中提到的其他人一样 - 这很臭......

在此代码段中:

const obj1 = {
    prop1: "value1",
    prop2: function() {
        this.prop1 = 10
        return "value2"
    }
}

在 getter 函数中修改是一个副作用,被认为是代码异味prop1prop2

0赞 lchennl 1/28/2023 #2

我不知道你的用例,但也许你可以做以下事情。 将包含您需要的结果obj3

const obj1 = {
  prop1: "value1",
  prop2: function () {
    this.prop1 = 10;
    return "value2";
  }
};
const obj2 = {
  ...obj1,
  prop2: obj1.prop2()
};


const prop2 = obj1.prop2;
const prop2Value = obj1.prop2();
const obj3 = {...obj1, ...prop2, prop2: prop2Value};

console.log(obj1);
console.log(obj2);
console.log(obj3);