为何Object.create()未继承默认值?我的实现理解有误吗?
问题解答
你的理解确实存在偏差,Object.create()的核心作用是创建一个新对象,并将传入的对象设置为这个新对象的原型,而非直接把传入对象的属性复制到新对象自身。
为什么会出现空对象输出?
JSON.stringify()只会序列化对象自身的可枚举属性,而你代码里的entry对象本身没有任何自身属性——allowInputStyleChange是存在于它的原型链(即defaults对象)上的。所以当你序列化entry时,自然会得到{}。
你可以通过以下代码验证这一点:
console.log(entry.allowInputStyleChange); // 输出true,原型链查找能找到该属性 console.log(Object.hasOwn(entry, 'allowInputStyleChange')); // 输出false,说明这不是entry自身的属性
如何得到你预期的结果?
如果希望新对象自身拥有defaults的属性,从而能被JSON.stringify正确序列化,可以用以下几种方式:
- 对象展开语法
const defaults = { allowInputStyleChange: true }; var entry = {...defaults}; console.log(JSON.stringify(defaults)); console.log(JSON.stringify(entry));
- Object.assign()
const defaults = { allowInputStyleChange: true }; var entry = Object.assign({}, defaults); console.log(JSON.stringify(defaults)); console.log(JSON.stringify(entry));
- 保留原型链同时复制属性
如果既想让defaults作为entry的原型,又想让entry自身拥有这些属性,可以结合使用Object.create()和Object.assign():
const defaults = { allowInputStyleChange: true }; var entry = Object.create(defaults); Object.assign(entry, defaults); console.log(JSON.stringify(defaults)); console.log(JSON.stringify(entry));
以上几种方式都能让你得到预期的输出结果。
内容的提问来源于stack exchange,提问作者mrid
相关产品推荐
相关产品推荐

