0

我有一个像

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

现在我想创建一个 Profile 实例并给它 id 和 name,并保持活动默认为 true,所以我这样做:

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

然后我得到了一个名为 p1 的对象,但我在其中找不到“活动”

Object.getOwnPropertyNames(p1);

我也不能使用 JSON.stringify(p1) 来序列化属性“活动”,但我需要属性“活动”可以是可序列化的。

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

4

2 回答 2

1

从 getOwnPropertyNames 上的 MDN 页面:

返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组。

active 属性在 p1 的 proto 对象上,而不是在 p1 上。

for in您可以使用该构造遍历 p1 的所有属性(包括原型链上的属性) 。要创建平面对象,您可以这样做:

for (var key in obj) {
  if (!obj.hasOwnProperty(key)) {
    obj[key] = obj[key];
  }
}

Object.getOwnPropertyNameshttps ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

for in: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

Object.createhttps ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

于 2013-09-20T12:22:05.323 回答
1

由于您使用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对象不知道在 上active定义了一个属性Profile
JSON.stringify只检查我用 JSON 标记的步骤(第一个循环),所有其他检查(原型链)对 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!

查看我上一条评论中的链接,以获取有关此问题的更多详细信息

于 2013-09-20T14:35:17.103 回答