繁体   English   中英

为什么这个 Javascript 数据类型(看起来像一个对象)似乎有某种用于识别它的键?

[英]Why does this Javascript data type (which looks like an Object) appear to have a key of some sort for identifying it?

我试过用谷歌搜索这个,但是相关的搜索词很模糊,我什么也没找到。

object 来自第三方库 (Jibestream)。

这是一些假设的代码:

const myObject = thirdPartyLibrary.getMyObject();

如果我执行console.log(myObject) ,我会在我的 Chrome DevTools 中看到:

代码截图

它看起来像 object,但这个n键似乎是某个标识符。

当我尝试复制它时,如下所示:

const newWaypointsArray = getNewWaypoints();
const myNewObject = { ...myObject, waypoints: newWaypointsArray };

然后做console.log(myNewObject) ,我看到了:

在此处输入图像描述

这是相同的,但没有n标识符。

将这个新的n -less object 传递回第三方库提供的方法不起作用,而使用原始 object 确实有效。 我必须假设它与那个n标识符有关。

  1. 这个理论是否有意义,他们的图书馆需要保留这个标识符,这就是它不起作用的原因吗?
  2. 有没有办法复制 object 而不会丢失该标识符?

提前致谢。

就像评论中已经说明的那样, n是 object 的 class 名称。 这很可能是将myNewObject传递给第三方库不起作用的原因。 该库很可能会使用 object 的 class 上可用的原型函数之一。

制作 object 副本的最佳方法是在可用时使用提供的方法。 例如array.slice()将创建一个浅拷贝,如其文档中所述。

如果没有记录 class 或没有可用的复制方法,您始终可以获取收到的 object 的原型并使用它来创建新的 object。 然后复制实例属性:

const myObject = thirdPartyLibrary.getMyObject();

// create an object using the same prototype
const copy = Object.create(Object.getPrototypeOf(myObject));
// copy over properties
Object.defineProperties(copy, Object.getOwnPropertyDescriptors(myObject));

创建副本后,您可以在不影响原始 object 的情况下自由更新其属性。 请注意, copy仍然是浅复制 因此更改postCopy.creator.username = "something_else"会更改原始文件,因为您没有更改副本(原始文件和副本都指向同一个创建者)。 有关更多信息,请参阅链接。

 // mock class Person { constructor(name) { this.name = name; } greet() { return `hello ${this.name}`; } } const thirdPartyLibrary = { getMyObject() { return new Person("John Doe"); }, useMyObject(person) { return person.greet(); }, }; // answer const myObject = thirdPartyLibrary.getMyObject(); const copy1 = {...myObject}; // your current attempt try { console.log("copy1:", thirdPartyLibrary.useMyObject(copy1)); } catch (error) { console.log("copy1:", error.message); } const copy2 = Object.create(Object.getPrototypeOf(myObject)); Object.defineProperties(copy2, Object.getOwnPropertyDescriptors(myObject)); console.log("copy2:", thirdPartyLibrary.useMyObject(copy2));

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM