You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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正确序列化,可以用以下几种方式:

  1. 对象展开语法
const defaults = {
    allowInputStyleChange: true
};

var entry = {...defaults};

console.log(JSON.stringify(defaults));
console.log(JSON.stringify(entry));
  1. Object.assign()
const defaults = {
    allowInputStyleChange: true
};

var entry = Object.assign({}, defaults);

console.log(JSON.stringify(defaults));
console.log(JSON.stringify(entry));
  1. 保留原型链同时复制属性
    如果既想让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:33:20