You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何_.clone()无法复制对象方法?Angular不同版本表现存差异?

问题分析:Underscore _.clone() 未复制对象方法及Angular版本差异原因

核心原因:Underscore _.clone() 的拷贝逻辑

_.clone() 本质是浅拷贝,仅会复制对象自身的可枚举自有属性,不会处理原型链上的方法(比如你定义的toString)——类的方法默认挂载在原型上,不属于实例的自有属性,所以克隆后的对象自然不会包含这些方法。

Angular 12与13输出差异的根源

你看到的bar字段在两个版本中的表现不同,和Angular升级后TypeScript的编译选项变化有关:

  • Angular 13 默认升级了TypeScript版本,并启用了useDefineForClassFields编译选项(符合ES6+类字段标准)
  • 在旧版TypeScript(Angular12对应的版本)中,类字段会被编译成带有getter/setter的可枚举属性,所以_.clone()能捕获到bar并显示为ƒ;而启用useDefineForClassFields后,类字段的可枚举性或属性类型发生了变化,_.clone()无法再复制这个字段。

正确克隆类实例的方案

因为_.clone()并不适合克隆类实例,推荐以下几种方式:

  • 直接调用类的构造函数:
    const bar = new FooBar(foo.foo, foo.bar);
    
  • 在类内部实现克隆方法:
    class FooBar {
      // ... 原有代码
      clone(): FooBar {
        return new FooBar(this.foo, this.bar);
      }
    }
    // 使用:const bar = foo.clone();
    
  • 若需要深拷贝(处理嵌套属性),可使用原生API structuredClone() 或Lodash的_.cloneDeep()(注意Lodash对类实例的克隆需确保类结构兼容)

内容的提问来源于stack exchange,提问作者Euphoria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:03:41