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

fabric.js为图形添加自定义属性时出现this.callSuper报错问题

解决Fabric.js矩形自定义属性导致this.callSuper is not a function的问题

这个问题我之前也碰到过,其实是你覆盖toObject方法时的上下文绑定出了问题,导致原Fabric对象的内部逻辑找不到正确的this指向,才抛出了this.callSuper is not a function的错误。下面给你两种可行的解决办法:

方法一:直接修正实例的toObject方法(单个实例场景)

你原来的IIFE写法会导致this指向混乱,改成直接保存原方法并绑定正确上下文的方式就行:

let rect = new fabric.Rect();
// 先保存原始的toObject方法
const originalToObject = rect.toObject;
// 重新定义toObject,确保调用原方法时this指向当前矩形实例
rect.toObject = function() {
  return fabric.util.object.extend(originalToObject.call(this), { 
    name: 'some name' 
  });
};
this.canvas.add(rect);

这样修改后,当canvas.toJSON()调用矩形的toObject时,originalToObject.call(this)里的this就是当前的矩形实例,原Fabric方法里的callSuper就能正常执行了。

方法二:扩展Fabric.Rect类(多个实例场景推荐)

如果需要创建多个带自定义属性的矩形,更推荐扩展原生的fabric.Rect类,这样所有实例都能继承这个逻辑,代码也更规范:

// 创建自定义矩形类,继承fabric.Rect
const CustomRect = fabric.util.createClass(fabric.Rect, {
  // 定义自定义属性的默认值
  name: '',
  // 重写toObject方法,指定要包含的自定义属性
  toObject: function(propertiesToInclude) {
    // 调用父类的toObject方法,传入需要额外序列化的属性名
    return this.callSuper('toObject', ['name', ...(propertiesToInclude || [])]);
  }
});

// 创建自定义矩形实例,直接传入name属性
let rect = new CustomRect({ name: 'some name' });
this.canvas.add(rect);

这种方式完全遵循Fabric的扩展机制,不仅能正确序列化自定义属性,还能支持后续扩展更多属性,维护起来更方便。

为什么原来的写法会报错?

你用IIFE包裹的写法里,toObject.call(this)中的this在IIFE执行时,指向的是全局对象(非严格模式)或者undefined(严格模式),而不是你的矩形实例。当canvas.toJSON()调用这个方法时,原Fabric内部的callSuper方法找不到正确的上下文,自然就抛出错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:23:42