![](/img/trans.png)
[英]JavaScript syntax which looks like Array function: [variable] ({ key }, arg) { }
[英]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
标识符有关。
提前致谢。
就像评论中已经说明的那样, 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.