我很难理解为什么以下代码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
关键字以某种方式绑定到它们被添加到的对象?
答案 0 :(得分:4)
Object.assign不会复制访问者。因此,当你的啪啪声在你的吸气宝贝之前,它的各种伏都使用了Object.assign,并且访问者不会再次从第二个,那种善良的伏都教复制到第一个对象上。当你的splat在getter之后,然后使用getter将splatted属性分配给对象,并保留getter。
相关代码摘录:
**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 } }