Как работает модель наследования 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);