2017-11-29 9 views
0

このコードはfabricjsサイトからです:fabricjs toObject生命維持

var rect = new fabric.Rect(); 

rect.toObject = (function(toObject) { 
    return function() { 
     return fabric.util.object.extend(toObject.call(this), { 
     name: this.name 
    }); 
    }; 
    })(rect.toObject); 

私の質問です:なぜそれがすぐに呼び出された機能を持っていませんでした。このように書くことはできません。同じ結果が得られます:

var rect = new fabric.Rect(); 
    rect.toObject = function() { 
      return fabric.util.object.extend(rect.toObject.call(this), { 
      name: this.name 
      }); 
    }; 

2つのバージョンの間に違いがあります。

あなたは

答えて

0
1 > var rect = new fabric.Rect(); 
2 > rect.toObject = function() { 
3 > return fabric.util.object.extend(rect.toObject.call(this), { //here you are calling same toobject 
4 >  name: this.name 
5 > }); 
6 > }; 

3行目では、あなたが今、定義された同じオーバーライドされたメソッドrect.toObjectを参照するrect.toObjectを呼び出しているありがとうございます。あなたが一度それを呼び出すならば、それはループの上に行くでしょう。そして、あなたにUncaught RangeError: Maximum call stack size exceeded

1 > var rect = new fabric.Rect(); 
2 > rect.toObject = (function(toObject) { 
3 > return function() { 
4 >  return fabric.util.object.extend(toObject.call(this), { 
5 >  name: this.name 
6 >  }); 
7 > }; 
8 > })(rect.toObject); 

を与えるここでライン8 rect.toObjectで外部キーとして渡して元のメソッドです。したがって、行4のtoObject.callは、オーバーライドされたメソッドの代わりに元のメソッドを呼び出します。元のtoObjectメソッドの戻り値をnameプロパティで拡張し、拡張値を返します。

これはオブジェクト固有のものです。クラスメソッドをオーバーライドする場合は、実行する必要があります。

fabric.Rect.prototype.toObject = (function(toObject) { 
    return function() { 
    return fabric.util.object.extend(toObject.call(this), { 
     name: this.name 
    }); 
    }; 
})(fabric.Rect.prototype.toObject); 
+0

ありがとうございます。わかった。 書かれている方法: rect.toObject =(関数....最後まで) は、特にrectというこの1つのインスタンスのtoObjectメソッドにのみ影響し、他のRectオブジェクトには影響しません。 すべてのRectに影響を与えたい場合は、 Rect.prototype.toObject =(関数...最後まで) 正しいですか? ありがとうございました – Jay

+0

@Jay check updated answer。 – Durga

関連する問題