2017-09-21 9 views
-1

このコードは、追加のプロパティを持つ長方形クラスを拡張するためのものですが、次のコードフォームのJSサイトを持っています。コード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); 

canvas.add(rect); 

rect.name = 'trololo'; 
+0

rectオブジェクトの 'toObject'メソッドをオーバーライドしています。これは、そのオブジェクトに対してのみ' fabric.Rect() 'オブジェクトのすべてに適用されません。オブジェクトを直列化しているときに 'toObject'メソッドが呼び出されます。その場合、オブジェクトに追加のプロパティとして' name'が追加されます。 – Durga

+0

はい私はこの行が何をしているか知りたいと理解しています。 return fabric.util.object.extend(toObject.call(this)、{ name:this.name }); – Shakthi

答えて

0

このコードの断片は全てfabric.Rect(S)のtoObject方法を拡張されていません。 作成したばかりのrect varでホストされているfabric.Rectの特定のインスタンスのtoObjectメソッドを上書きしています。

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

fabric.util.object.extendは、lodash mergeと同じです。第1引数としてオブジェクトをとり、第2引数からオブジェクトのプロパティを追加します。

to.Object.call(this)は、ラッピング関数の最初の引数であるtoObject(修正前のrect.toObject)を呼び出しています。

ファブリックサポートコードを修正することなく使用することなく、この機能:

rect.toObjectを([ '名前'])。

それともこれを書くためのよりよい方法は、次のようになります。

var originalToObject = fabric.Rect.prototype.toObject; 
fabric.Rect.prototype.toObject = function(additionalProps) { 
    var originalObject = originalToObject.call(this, additionalProps); 
    originalObject.name = this.name; 
    return originalObject; 
}; 

この場合は、より明確にすることができます。