与扩展运算符中对象字面量的差异 Object.create

Difference Object.create with object literal in spread operator

在这种情况下,从对象文字和 Object.create 创建的对象在扩展运算符中有不同的结果。据我所知,传播运算符只是传播自己的属性而不是继承的属性,但在这种情况下,为什么在对象文字中结果是 1 而不是未定义? o不是继承给p吗?

let o = {x: 1}; 
let p = { ...o };
console.log(p.x) // => 1

let q = Object.create({y: 1}); 
let r = { ...q };
console.log(r.y) // => undefined

Object.create() 和文字对象有区别。使用 Object.create 时,您要求 JavaScript 创建一个新对象并继承已传递的对象的所有内容。基本上,如果您像这样更改代码:

let baseObject = {y: 1};
let q = Object.create(baseObject);

在这里,您基本上是在创建一个新对象,该对象在其原型链中继承了 baseObjecty。所以你可以检查 Object.keys(q) 不包含 y 键,因为它是从它的 __proto__ 对象继承的:

Object.keys(q); // []

但是:

Object.keys(q.__proto__); // ["y"]

这是因为:

console.log(q.__proto__ === baseObject); // true

传播运算符只传播直接存在于对象的第一层中的键,它不通过原型链。

要了解有关此主题的更多信息,您可以查看这篇文章:Inheritance and the prototype chain