0

http://jsfiddle.net/VTK7K/

Kinetic.Node.prototype.test = function() {
    alert('worked');
};

var d = new Kinetic.Image({});
d.test();

プロトタイプ メソッドを Kinetic.Node に追加して、それを拡張するすべてのオブジェクトで使用できるようにしようとしています。これは一部のオブジェクトでは機能しないようで、他のオブジェクトでは機能するようです。

私は何か間違ったことをしていますか?

4

2 に答える 2

1

オブジェクトが定義されるときに、プロトタイプが宣言されます。インスタンス化されると、KineticJS のプロトタイプに関連することは何もしません。

オブジェクトのプロトタイプを再定義するには、次のコマンドを再度実行して、Kinetic.Node のプロトタイプを追加します。

Kinetic.Global.extend(Kinetic.Container, Kinetic.Node);
Kinetic.Global.extend(Kinetic.Shape, Kinetic.Node);
Kinetic.Global.extend(Kinetic.Group, Kinetic.Container);
Kinetic.Global.extend(Kinetic.Layer, Kinetic.Container);
Kinetic.Global.extend(Kinetic.Stage, Kinetic.Container);
Kinetic.Global.extend(Kinetic.Circle, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Ellipse, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Image, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Line, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Path, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Polygon, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Rect, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.RegularPolygon, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Sprite, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Star, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Text, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.TextPath, Kinetic.Shape);
Kinetic.Global.extend(Kinetic.Wedge, Kinetic.Shape);
于 2013-02-26T05:34:23.153 に答える
1

問題は、Kinetic オブジェクトの作成中にすべてのメソッドがコピーされ、接続が忘れられているように見えることです。

// v4.3.1, l. 54
Kinetic.Global.extend(Kinetic.SceneCanvas, Kinetic.Canvas);

// v4.3.1, l. 785
extend: function(c1, c2) {
    for(var key in c2.prototype) {
        if(!( key in c1.prototype)) {
            c1.prototype[key] = c2.prototype[key];
        }
    }
},

1 つの可能性は、KineticJS 独自の拡張メカニズムを使用して、追加のプロトタイプ エントリを Kinetic ハッシュ内の ctor 関数にコピーすることです。

var KineticMixin = function() {};
KineticMixin.prototype = {
    doSomething : function () { console.log("yo-ho-ho"); }
};

for(var key in Kinetic) {
    if(Kinetic.Type._isFunction(Kinetic[key])) {
        Kinetic.Global.extend(Kinetic[key], KineticMixin);
    }
}

var d = new Kinetic.Image({});
d.doSomething();

拡張する ctor 関数にその名前のエントリが既にある場合、それは無視されます。したがって、それextendを考慮して関数をコピーして変更することをお勧めします。そして、Kinetic オブジェクトのすべてのキーを実行するだけではいけないことのように思えます。おそらく、より良い方法があることを明示的に示しています。

于 2013-02-26T04:07:59.993 に答える