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