http://jsfiddle.net/VTK7K/在Kinetic.js中,原型节点不会影响所有的孩子吗?
Kinetic.Node.prototype.test = function() {
alert('worked');
};
var d = new Kinetic.Image({});
d.test();
我试图一个原型方法添加到Kinetic.Node,使其可用于扩展它的所有对象,这似乎不能与某些对象的工作,并不会为别人打工。
我做错了什么?
http://jsfiddle.net/VTK7K/在Kinetic.js中,原型节点不会影响所有的孩子吗?
Kinetic.Node.prototype.test = function() {
alert('worked');
};
var d = new Kinetic.Image({});
d.test();
我试图一个原型方法添加到Kinetic.Node,使其可用于扩展它的所有对象,这似乎不能与某些对象的工作,并不会为别人打工。
我做错了什么?
原型是在定义对象时声明的。在实例化时,它与KineticJS,afaik中的原型没有任何关系。
要重新定义对象的原型,可以再次运行以下内容以添加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);
问题是,所有的方法都创造动力学对象的过程中被复制,然后连接似乎忘记了:
// 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];
}
}
},
一种可能性是使用KineticJS自身的扩展机制额外的原型条目复制到构造函数的功能在动力学哈希中:
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对象中的所有键似乎不是要做的事情。也许显然有更好的办法。