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

标签 javascript object serialization ecmascript-5

我有一个像这样的对象

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/

相关文章:

javascript - AFrame 内容无法在使用 hyperHTML 的 Chrome 上呈现

用于浏览器扩展的 Java 后端(Firefox 附加组件)

java - 如何将所有输出打印到txt文件

VB.net 中的 XML 序列化友元类

java - 使 EntityManager 可序列化

javascript - 使用 CryptoJS 解密 AES CFB 时有效字节数错误

javascript - 即 8 : move caret to the end of a text input field AND make the end visible

javascript - 函数参数未正确添加到 JSON 对象

javascript - 用javascript合并两个对象数组

javascript - 为什么数组偏移量被视为自己的属性?