V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
deepkolos
V2EX  ›  程序员

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

  •  
  •   deepkolos ·
    deepkolos · 2017-07-12 16:31:16 +08:00 · 2894 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2017-08-13 08:26:27 +08:00
    deepkolos
        1
    deepkolos  
    OP
       2017-07-12 17:05:40 +08:00
    function 是不是应该当作标量?
    zoffy
        2
    zoffy  
       2017-07-12 22:05:45 +08:00
    当你拷贝的时候拷贝的是什么?当然是对象实例啊,而不是类。所以为什么要拷贝 prototype?
    Sapp
        3
    Sapp  
       2017-07-13 09:41:38 +08:00
    你的意思是,a = { x: 1 } 和 b = { x: 2, c: 3 } 的 __proto__ 是不一样的?都是继承自 Object.prototype,你给拷贝了干嘛?
    joeychon
        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, 尤其是在用那些深度复制的方法时应该意识到这点。
    deepkolos
        5
    deepkolos  
    OP
       2017-07-13 17:14:22 +08:00
    @Sapp 主要是有些小的工具函数不想直接挂在 Array.prototype/Object.prototype 上面 , 所以深拷贝对象的时候 , 如果不复制__proto__的话就需要手动复制一遍先得有点别扭~~
    deepkolos
        6
    deepkolos  
    OP
       2017-07-13 17:19:14 +08:00
    @deepkolos 那个`function 是不是应该当作标量?`
    表达的意思有点不对 , 是复制 function 的时候需不需要使用 new Function(func.troSource())来复制 ?
    joeychon
        7
    joeychon  
       2017-07-13 19:13:36 +08:00
    @deepkolos 我不知道你想表达什么,new Function(func.toSource())是伴随信息损失的,打个比方:
    function afunc(){};
    afunc.x = "hello";
    经过你的复制,afunc.x 就没了。深度克隆的话只能用递归方法复制 func。
    deepkolos
        8
    deepkolos  
    OP
       2017-07-13 19:26:33 +08:00
    @joeychon 学到了~
    riophae
        9
    riophae  
       2017-08-13 01:19:23 +08:00
    可能挖坟了,不过看到这个问题忍不住想说点啥。
    建议楼主去看看 underscore/lodash 这类工具库模块的实现,比较严谨。参考它们的实现是没错的,它们都是深思熟虑过的产物,而且经过了时间考验。
    https://lodash.com/docs/4.17.4#cloneDeep
    deepkolos
        10
    deepkolos  
    OP
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.