javascript - 传播运算符与属性访问器( setter/getter )的问题

标签 javascript babeljs

我很难理解为什么以下代码存在一些问题 https://jsfiddle.net/q4w6e3n3/3/

注意:所有示例都在 chrome 版本 52.0.2743.116 中进行了测试,以防万一这有帮助

const model = {
  someVal: 'some val',
};


const obs = {
  ...model,
  get accessor() {
    return this.someVal;
  },
}

// Expected: '>>> some val'
// Actual: '>>> undefined'
console.log('>>>', obs.accessor);

但下面类似的代码段有效 https://jsfiddle.net/q4w6e3n3/5/

const model = {
  someVal: 'some val',
};


const obs = {
  get accessor() {
    return this.someVal;
  },
  ...model,
}

// Expected: '>>> some val'
// Actual: '>>> some val'
console.log('>>>', obs.accessor);

使用 babel REPL 我能够看到 Object.assign 如果在转译代码中可用则被使用 当我直接使用它而不是对象传播时,我遇到了同样的问题,如果放置 model 也可以工作 变量到结尾而不是开头。

这是一个错误吗?还是有意的行为?

另外为什么下面的代码片段也有效?:

const model = {
  someVal: 'some val',
};


const obs = {
  someVal: model.someVal,
  get accessor() {
    return this.someVal;
  },
}

// Expected: '>>> some val'
// Actual: '>>> some val'
console.log('>>>', obs.accessor);

https://jsfiddle.net/q4w6e3n3/6/

我希望它有同样的问题,但作为一个魅力的工作是 getters this 关键字以某种方式绑定(bind)到它们被添加到的对象?

最佳答案

Object.assign 不会复制访问器。所以当你的 splat 在你的 getter babel 之前并且它的各种巫术使用 Object.assign 并且访问器不会从第二个对象复制到第一个对象时,好吧,再次巫毒。当您的 splat 在 getter 之后时,它会将 splatted 属性分配给具有 getter 的对象,并保留 getter。

参见此处:MDN - Object.assign

相关代码摘录:

**Copying Accessors**
var obj = {
  foo: 1,
  get bar() {
    return 2;
  }
};

var copy = Object.assign({}, obj); 
console.log(copy); 
// { foo: 1, bar: 2 }, the value of copy.bar is obj.bar's getter's return value.

// This is an assign function that copies full descriptors
function completeAssign(target, ...sources) {
  sources.forEach(source => {
    let descriptors = Object.keys(source).reduce((descriptors, key) => {
      descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
      return descriptors;
    }, {});
    // by default, Object.assign copies enumerable Symbols too
    Object.getOwnPropertySymbols(source).forEach(sym => {
      let descriptor = Object.getOwnPropertyDescriptor(source, sym);
      if (descriptor.enumerable) {
        descriptors[sym] = descriptor;
      }
    });
    Object.defineProperties(target, descriptors);
  });
  return target;
}

var copy = completeAssign({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }

关于javascript - 传播运算符与属性访问器( setter/getter )的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39515321/

相关文章:

node.js - babel 在导入声明时遇到问题

javascript - 为什么切换到从 require 导入可以修复运行时错误?

javascript - 根据变量名称 react 奇怪的内部问题

javascript - 在 React 中使用 onClick 函数渲染多个按钮

javascript - 在移动设备上默认使用 hover/active CSS

javascript - React-native:如何在tvOS中实现图像缓存?

javascript - 如何循环浏览javascript中的按钮?

javascript - 提示时如何禁用textarea中的文本

node.js - 无法在我的 Nuxt 项目中使用 "node"命令导入 ES 模块

javascript - 在圆形路径上拖动 Canvas 元素