以下代码似乎无法复制到对象原型上。
const animalProto = {
eat() {
// function body
},
sleep() {
// function body
},
}
function animalCreator(proto, attributes) {
return {...Object.create(proto), ...attributes}
}
const cat = animalCreator(animalProto, { name: 'garfield' })
cat.eat() // this is an error; function is not defined; it doesn't appear to link the prototype chain.
如果我将价差替换为以下内容,则它会起作用:
return Object.assign(Object.create(proto), attributes)
本质上,我的问题是为什么Object.assign可以工作,而散布运算符却不能工作。是否有Object.assign正在执行的操作,表明传播运算符丢失了?
答案 0 :(得分:4)
请参见docs:
它将自己的可枚举属性从提供的对象复制到新对象。
“自己可枚举”表示将不包含原型的属性。
如果您传播具有继承属性的对象(例如使用Object.create
立即创建的对象),结果中将不会显示那些继承属性。
Object.assign
稍有不同-将所有属性分配给第一个的第一个。如果您传递了一个空对象作为第一个参数,则它与传播更相似:
return Object.assign({}, Object.create(proto), attributes)
在这种情况下,proto
中的任何内容都不会反映在输出中。
const proto = { foo: 'bar' };
const result = Object.assign({}, Object.create(proto), { another: 'prop' });
console.log(result);
答案 1 :(得分:3)
Object.create()
生成一个新对象,该对象是与传递给它的对象链接的原型。这意味着返回的对象不会获得父对象属性的副本,而仅具有指向父对象原型的链接。散布的对象仅复制对象自己的可枚举属性,不包括原型链中的那些对象。
const animalProto = {
eat() {
// function body
},
sleep() {
// function body
},
}
let o = Object.create(animalProto)
// o doesn't have it's own eat or sleep.
console.log(Object.getOwnPropertyNames(o))
console.log({...o}) // empty