2013-02-25 7 views
0

http://jsfiddle.net/VTK7K/Kinetic.js에서 프로토 타이핑 노드가 모든 하위 항목에 영향을 미치지 않습니까?

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

var d = new Kinetic.Image({}); 
d.test(); 
나는 그것을 확장하는 모든 객체에 사용할 수 있도록 Kinetic.Node에 프로토 타입 방법을 추가하려고 해요

, 이것은 일부 개체와 함께 작동하지 않는 것, 그리고 다른 사람에 대한 작업을 수행 .

내가 잘못 했나요?

답변

1

객체가 정의되면 프로토 타입이 선언됩니다. 그것이 인스턴스화 될 때, 그것은 afin 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); 
1

문제는 모든 방법은 운동 객체의 작성시 복사 한 다음 연결이 잊어 버린 것 같다이다 :

// 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]; 
     } 
    } 
}, 

하나의 가능성은 ctor에 기능을 추가 프로토 타입 항목을 복사 할 KineticJS 자신의 확장 메커니즘을 사용하는 것입니다 키네틱 해시 안에 다음의 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(); 

, 무시 it'l. 따라서이를 설명하기 위해 extend 함수를 복사하고 수정하는 것이 좋습니다. 그리고 Kinetic 객체의 모든 키를 실행하는 것은 이 아닌과 같은 것처럼 보입니다. 아마도 더 명백한 방법이 있습니다.