Как работает модель наследования KineticJS?
Я немного новичок в JavaScript, и я знаю, что существуют разные модели наследования, которые можно использовать. У меня есть проект, в котором я использовал KineticJS, и я заметил в своем changelog, что они изменили модель наследования с помощью релиз v3.10.3 проекта, чтобы мы могли 'more easily extend or add custom methods to Kinetic classes'
Я пробовал это, но я не могу найти ясного примера этого. Мне было интересно, может ли кто-нибудь сказать мне, что будет подходящим способом добавления как свойств, так и методов в кинетические классы, и как я могу расширить их, чтобы создать свои собственные пользовательские классы? Является ли модель наследования, используемая в KineticJS общей в javascript?
Ответы
Ответ 1
Я бы рекомендовал следовать методу, который выполняется внутри источника KineticJS. В этом сообщении в блоге объясняется, как, но немного устарели, поэтому я расскажу о последнем примере, который также показывает, как добавлять свойства к вашим пользовательским формам.
Приведенный ниже код дает пример создания нового объекта Shape.Arc
. В этом примере показано, как добавить как новые функции, так и свойства.
var Shape = {};
(function () {
Shape.Arc = function (config) {
this.initArc(config);
};
Shape.Arc.prototype = {
initArc: function (config) {
Kinetic.Shape.call(this, config);
this._setDrawFuncs();
this.shapeType = 'Arc;'
drc.ui.utils.setupShape(this);
},
drawFunc: function (context) {
context.beginPath();
context.arc(0,0, this.getRadius(), this.getStartAngle(),
this.getEndAngle(), true);
context.fillStrokeShape(this);
}
};
Kinetic.Util.extend(Shape.Arc, Kinetic.Shape);
//Add properties to shape.
//The code below adds the getRadius(), getStartAngle() functions above.
Kinetic.Factory.addGetterSetter(Shape.Arc, 'radius', 0);
Kinetic.Factory.addGetterSetter(Shape.Arc, 'startAngle', 0);
Kinetic.Factory.addGetterSetter(Shape.Arc, 'endAngle', 180);
})();
Важно, чтобы он был завернут в анонимную функцию, поэтому можно создать более одного экземпляра.
Чтобы создать дугу:
var arc = new Shape.Arc({
radius: radius,
x: centreX,
y: centreY,
startAngle: 0,
endAngle: Math.PI * 2
});
Ответ 2
Вы можете использовать разные способы.
1 Кинетический путь. Пример из источника кинетики:
Kinetic.Circle = function(config) {
this._initCircle(config);
};
Kinetic.Circle.prototype = {
_initCircle: function(config) {
this.createAttrs();
// call super constructor
Kinetic.Shape.call(this, config);
this.shapeType = 'Circle';
this._setDrawFuncs();
},
drawFunc: function(canvas) {
/*some code*/
}
/* more methods*/
};
Kinetic.Global.extend(Kinetic.Circle, Kinetic.Shape);
2 Также вы можете наследовать его с помощью coffeescript: coffeescript Class
Но в js это выглядит не очень хорошо:
var Gallery,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Gallery = (function(_super) {
__extends(Gallery, _super);
function Gallery(config) {
Kinetic.Stage.call(this, config);
}
Gallery.prototype.add = function(item) {
console.log(item);
return Gallery.__super__.add.call(this, item);
};
Gallery.prototype.method = function() {
return console.log('test');
};
return Gallery;
})(Kinetic.Stage);