gpt4 book ai didi

javascript - 使用 Object.create 时无法枚举属性

转载 作者:行者123 更新时间:2023-12-02 18:20:04 25 4
gpt4 key购买 nike

我有一个像这样的对象

var Profile = Object.create(null);
Object.defineProperties(Profile, {
id: {
value: "",
enumerable: true
},
name: {
value: "",
enumerable: true
},
active: {
value: true,
enumerable: true
}
});

现在我想创建一个 Profile 实例并为其指定 id 和名称,并保持事件默认 true,所以我这样做:

var p1 = Object.create(Profile, {
id: {
value: "123",
enumerable: true
},
name: {
value: "hello world",
enumerable: true
}
});

然后我得到了一个名为 p1 的对象,但我找不到“active”

Object.getOwnPropertyNames(p1);

此外,我无法使用 JSON.stringify(p1) 序列化属性“active”,但我需要属性“active”可以序列化。

这是我使用 Object.create 的错误方式吗?我只想创建一个可序列化的“类”并获取它的可序列化的“实例”。我怎样才能做到这一点?

最佳答案

由于您使用了Object.create,您并没有真正将任何内容克隆/复制到结果对象中(您调用p1)。首先,你必须了解 JS 在访问对象属性时如何解析它们:

J [     p1.active     ]<=========================================================\ \
S p1[active] ==> JS checks instance for property divide | |
O /\ || | |
N || || --> property found @instance? return value-------------------------------| |
= || || | |
|| ===========> p1.prototype is found: Profile, check that object | |
N || || | |
O || ||--> Profile.active found @Profile instance, return-------------------| |
T || || | |
|| ==========> Profile.prototype.active (== Object.prototype.active) | |
J || || | |
S || ||--> property found @Object.prototype, return---------------------|_|
O || || |=|
N || =======>prototype is null, return "undefined.active"~~~~~~~~~~~~~~~|X|
|| \ /
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< TypeError can't read property 'x' of undefined

这基本上就是可能发生的事情。现在,在调用 JSON.stringify(p1) 时,JS 将转向 p1 对象,并处理其属性(@instance 级别定义的属性)。 p1 对象不知道在 Profile 上定义了 active 属性。
JSON.stringify 仅检查我用 JSON 标记的步骤(第一个循环),所有其他检查(原型(prototype)链)对 JSON 不感兴趣。 9/10,无论如何,这只是 Object.prototype,您现在不想将其字符串化,可以吗?

老实说,对于您(看似)想要实现的目标,最简单的解决方案是这样的:

p1 = JSON.parse(JSON.stringify(Profile));
p1.id = 123;
p1.name = 'hello world';
console.log(JSON.stringify(p1));//will show active property!

查看我上一条评论中的链接,了解有关此事的更多详细信息

关于javascript - 使用 Object.create 时无法枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18916604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com