我删除了由粗体按钮创建的星号,因为这似乎会让人们感到困惑。输出是直接从控制台复制的,一个对象前面有一个 i,而克隆则没有。
i 显然对fabric.js 表示重要的东西,因为fabric.js 不会将克隆识别为有效,即使它们在其他方面都是相同的。
所谓的重复和我的问题之间的区别:
我正在尝试克隆(按值)fabric.js 对象,当我 console.log() 两个对象时,其中一个对象前面有一个 i
old-objects i {_objects: Array(56), width: 350, height: 350, toBeParsed: false, minX: -0, …}
new-objects {_objects: Array(56), width: 350, height: 350, toBeParsed: false, minX: -0, …}
新对象是由
创建的newo = Object.assign({}, o);
其中 o 是来自 canvas.getObjects() 的原始 Fabric.js (5.3) 对象
其他都一样。
使用 Object.assign 克隆对象
您在对象属性之前看到的
i
是该对象所属的类的名称。你可能想知道,“谁会命名一个类 i?”;好吧,根据所使用的库的上下文,它们可能不会,而且我也可能是该类的丑化/压缩/缩小版本。也就是说,该类的名称被替换为单个字符,以减少相关库的整体大小。
i
不会出现在克隆对象的属性之前,因为您不克隆类本身,而只是克隆其可见(如可枚举)属性。
您可以在控制台中轻松复制此操作,但我在下面添加了一个片段来说明:
class i {
test1 = 'one';
test2 = 'two';
}
Object.defineProperty(i, 'test3', {
value: 'three',
enumerable: false,
});
const j = new i();
console.log(j);
const k = Object.assign({}, j);
console.log(k);
复制此内容的第二种方法大致相同,但它涉及在执行代码之前缩小代码。