对象分配和对象传播之间的不同结果

问题描述 投票:0回答:1

我正在使用打字稿并编译到ES2016。我注意到我在this中使用相似的Function.prototype.call()对象调用了两个不同的函数。我尝试通过使用将在对象开头使用this的通用对象来合并两个...spread对象,例如

let selfShared = {
  props,
  // ...
};

let selfHost = {
  ...selfShared,
  // ...
};

let selfGuest = {
  ...selfShared,
  // ...
};

在乞讨中使用传播的想法是,如果我认为合适的话,我可以覆盖两个this对象中的任何一个的共享属性。但是与使用传播在props对象中直接设置this时产生的怪异结果不同,这是因为tsc将代码编译为

let selfShared = {
  props
};

let selfHost = Object.assign(Object.assign({}, selfShared), {
  // ...
});

// ...

使用我的代码

let state = undefined;
let attributes = {};
let selfShared = {
  props: attributes
};

let selfHost = {
  ...selfHost,
  get state() {
    console.log("selfHost get state");
    return state;
  },
  set state(originalStates) {
    console.log("selfHost set state");
    !state ? state = originalStates : console.error("`this.states` already defined in the host function.");
  }
}

输出看起来像

let state = undefined;
let attributes = {};
let selfShared = {
  props: attributes
};

let selfHost = Object.assign(
  Object.assign({}, selfShared), {
  get state() {
    console.log("selfHost get state");
    return state;
  },
  set state(originalStates) {
    console.log("selfHost set state");
    !state ? state = originalStates : console.error("`this.states` already defined in the host function.");
  }
});

至少现在在firefox 74到77上,将两个代码都插入控制台并添加

// ...
selfHost.state = {
  thing: "some"
};
selfHost.state = {
  some: "thing"
};

抛出不同的日志...预编译的代码给了我两个set state和一个错误,它们是预期的输出,但是编译的代码给了我一个get state,并且忽略了set state输出中的规则]

{
  some: "thing"
}

而不是预期的

{
  thing: "some"
}

与预编译的代码一样?

将展开设置为文件底部编译为

let selfHost = Object.assign({
  get state() {
    console.log("selfHost get state");
    return state;
  },
  set state(originalStates) {
    console.log("selfHost set state");
    !state ? state = originalStates : console.error("`this.states` already defined in the host function.");
  }
}, selfShared);

给出正确的输出,但不允许我覆盖selfShared给定的属性。

您能解释一下为什么Object.assign会发生这种情况吗,如果有一个技巧可以从tsc中获得输出,但仍然可以让我执行我最初想要的操作?

我正在使用打字稿并编译到ES2016。我注意到我正在Function.prototype.call()中调用两个与此对象相似的不同函数。我试图通过使用...

javascript typescript tsc
1个回答
0
投票

使用点差时

© www.soinside.com 2019 - 2024. All rights reserved.