与扩展运算符中对象字面量的差异 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);
在这里,您基本上是在创建一个新对象,该对象在其原型链中继承了 baseObject
的 y
。所以你可以检查 Object.keys(q)
不包含 y
键,因为它是从它的 __proto__
对象继承的:
Object.keys(q); // []
但是:
Object.keys(q.__proto__); // ["y"]
这是因为:
console.log(q.__proto__ === baseObject); // true
传播运算符只传播直接存在于对象的第一层中的键,它不通过原型链。
要了解有关此主题的更多信息,您可以查看这篇文章:Inheritance and the prototype chain
在这种情况下,从对象文字和 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);
在这里,您基本上是在创建一个新对象,该对象在其原型链中继承了 baseObject
的 y
。所以你可以检查 Object.keys(q)
不包含 y
键,因为它是从它的 __proto__
对象继承的:
Object.keys(q); // []
但是:
Object.keys(q.__proto__); // ["y"]
这是因为:
console.log(q.__proto__ === baseObject); // true
传播运算符只传播直接存在于对象的第一层中的键,它不通过原型链。
要了解有关此主题的更多信息,您可以查看这篇文章:Inheritance and the prototype chain