函数初始化的重新定义会导致结构.js中的递归



我有自己的类PersonTextBox继承自Fabric Textbox

另外,我需要为文本框重新定义函数initialize,以稍微更改类型为TextboxPersonTextBox的对象的行为。

我以以下方式实现了它:

fabric.PersonTextBox = fabric.util.createClass(fabric.Textbox, fabric.Observable, {  
  type: 'personTextBox'        
});
/**
 * Redefine function initialize.
 */
fabric.Textbox.prototype.initialize = function(text, options) {
  this.fillHtmlStyle(text);
  this.callSuper('initialize', text, options);
  this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility());
  this.ctx = this.objectCaching ? this._cacheContext : fabric.util.createCanvasElement().getContext('2d');
  // add width to this list of props that effect line wrapping.
  this._dimensionAffectingProps.push('width');
};
/**
 * Fill source text.
 * @text - plain text without html.
 */
fabric.Textbox.prototype.fillHtmlStyle = function(text) {
  this.htmlStyle = '<p>' + text + '</p>';
};
var canvas = new fabric.Canvas('c');
canvas.add(new fabric.PersonTextBox('My text'));
canvas.renderAll();
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.7/fabric.min.js"></script>
<body>
  <canvas id="c" width="1000" height="1000"></canvas>
</body>

JSFiddle https://jsfiddle.net/Eugene_Ilyin/p6ep1dfb/

如您所见,控制台中出现一个错误:

fabric.js:1922 Uncaught RangeError: Maximum call stack size exceeded
    at klass.callSuper (VM123 fabric.js:1922)
    at klass.fabric.Textbox.initialize ((index):55)
    at klass.callSuper (VM123 fabric.js:1925)
    at klass.fabric.Textbox.initialize ((index):55)
    at klass.callSuper (VM123 fabric.js:1925)
    at klass.fabric.Textbox.initialize ((index):55)
    at klass.callSuper (VM123 fabric.js:1925)
    at klass.fabric.Textbox.initialize ((index):55)
    at klass.callSuper (VM123 fabric.js:1925)
    at klass.fabric.Textbox.initialize ((index):55)

我发现在结构 v1.7.20 中它可以工作,但在 v1.7.7 中它不起作用。为什么我做错了,我该如何纠正这个错误?

提前致谢

作为解决方案,我将我的 fabric.js 库更新到 1.7.10 版,它有所帮助。

另外,我发现了一个描述此错误的问题 https://github.com/kangax/fabric.js/pull/3844

但是我在另一种情况下再次遇到这个问题。检查代码后,我发现当开发人员创建新类时,他应该使用 fabric.util.createClass。此函数调用函数 addMethods。它允许通过继承链调用函数。

结论是,通过原型覆盖方法是织物.js不正确的方法。如果需要重写某些函数,则应创建自己的类。也许在某些情况下,通过原型覆盖功能会起作用。但不是在被覆盖的函数中有"callSuper"的情况下。

附言我不建议在 1.7.10 上更新,这个版本有一个带有 SVG 路径的错误。

最新更新