深拷贝在 js 里面的含义是否应该包含__proto__的拷贝?

2017-07-12 16:31:16 +08:00
 deepkolos

还是__proto__的拷贝应该归类为继承?

2708 次点击
所在节点    程序员
10 条回复
deepkolos
2017-07-12 17:05:40 +08:00
function 是不是应该当作标量?
zoffy
2017-07-12 22:05:45 +08:00
当你拷贝的时候拷贝的是什么?当然是对象实例啊,而不是类。所以为什么要拷贝 prototype?
Sapp
2017-07-13 09:41:38 +08:00
你的意思是,a = { x: 1 } 和 b = { x: 2, c: 3 } 的 __proto__ 是不一样的?都是继承自 Object.prototype,你给拷贝了干嘛?
joeychon
2017-07-13 13:04:43 +08:00
deep copy 也就是 deep clone。deep copy 按照我的理解是要 copy 对象的 prototype 的,当然这是对于用户定义 prototype 对象来说的,built-in 对象不需要拷贝。需要注意的是,由于闭包和私有变量,js 是不支持深度复制的,换句话说,用 js 无法真正实现 deep clone, 尤其是在用那些深度复制的方法时应该意识到这点。
deepkolos
2017-07-13 17:14:22 +08:00
@Sapp 主要是有些小的工具函数不想直接挂在 Array.prototype/Object.prototype 上面 , 所以深拷贝对象的时候 , 如果不复制__proto__的话就需要手动复制一遍先得有点别扭~~
deepkolos
2017-07-13 17:19:14 +08:00
@deepkolos 那个`function 是不是应该当作标量?`
表达的意思有点不对 , 是复制 function 的时候需不需要使用 new Function(func.troSource())来复制 ?
joeychon
2017-07-13 19:13:36 +08:00
@deepkolos 我不知道你想表达什么,new Function(func.toSource())是伴随信息损失的,打个比方:
function afunc(){};
afunc.x = "hello";
经过你的复制,afunc.x 就没了。深度克隆的话只能用递归方法复制 func。
deepkolos
2017-07-13 19:26:33 +08:00
@joeychon 学到了~
riophae
2017-08-13 01:19:23 +08:00
可能挖坟了,不过看到这个问题忍不住想说点啥。
建议楼主去看看 underscore/lodash 这类工具库模块的实现,比较严谨。参考它们的实现是没错的,它们都是深思熟虑过的产物,而且经过了时间考验。
https://lodash.com/docs/4.17.4#cloneDeep
deepkolos
2017-08-13 08:26:27 +08:00
@riophae 谢谢~ 看文档里说是跟寻 Structured_clone_algorithm 的规范来走的, 按照规范来走的话, function 不属于被 clone 的范围了 , 即便是 object 的 clone, 也只是 clone plain object . 还是谢谢建议~

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX