Backbone: рдмреИрдХрдмреЛрди рдФрд░ ES6 рдХреНрд▓рд╛рд╕реЗрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЕрдкреНрд░реИрд▓ 2015  ┬╖  63рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jashkenas/backbone

ES6 рд╡рд░реНрдЧ рдпреБрдХреНрддрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде (рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ ), рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде ES6 рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдм рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦрд╛

рддреЛ рдпрд╣:

class DocumentRow extends Backbone.View {

    constructor() {
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        super();
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

рдЕрдВрддрд┐рдо ES6 рдпреБрдХреНрддрд┐ рдореЗрдВ рдЕрдм рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрджрд┐ рдЖрдк рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ 3 (рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ) рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ

рдмреИрдХрдмреЛрди рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЧреВрдВрдЧрд╛ рд▓рдЧрддрд╛ рд╣реИ:

class DocumentRow extends Backbone.View {

    tagName() { return "li"; }

    className() { return "document-row";}

    events() {
        return {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

рд╡рд░реНрддрдорд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдПрдБ

рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реАрдЖрдИрдбреА, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реА рдмрд╛рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред

рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ

рдпрд╣ рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

class MyView extends Backbone.View {
  constructor(options) {
    _.defaults(options, {
      // These options are assigned to the instance by Backbone
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      },
      // This option I'll have to assign to the instance myself
      foo: 'bar'
    });


    super(options);


    this.foo = options.foo;
  }
}

рдЪреВрдВрдХрд┐ рдЗрди рд╕рднреА рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдореМрдЬреВрджрд╛ рдмреИрдХрдмреЛрди рдПрдХреНрд╕рдЯреЗрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдкрд╖реНрдЯ рд╕рдордЭреМрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рд░рд╛рдЗрдЯрдЕрдк рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ рд╡рд╣ рдПрдХ "рдЧреБрдг" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдерд╛ рдЬреЛ рдЧреБрдгреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрдм рдЙрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдкрд░ рдореБрдЭреЗ https://github.com/epicmiller/es2015-default-class-properties рдПрдХ рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд┐рд▓рддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдмреИрдХрдмреЛрди рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдкреЛрд░реНрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

class MyModel extends Backbone.Model.extend({
   idAttribute: 'id'
}) {
   // ...
};

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб MyModel.prototype.idAttribute рдХреЛ рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ ES6 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ ...

рд╕рднреА 63 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдБ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрдорд░ рд╣реИред рд▓реЗрдЧрд╡рд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдиреА рдХрд╛ рдиреИрддрд┐рдХ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рдИрдПрд╕ 6 рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рд╕рдорд░реНрдерди рднреВрдорд┐ рддрдХред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлреЙрд▓рдмреИрдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╕рдорд╛рдзрд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕/рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдмреИрдХрдмреЛрди рдХреЗ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЗрди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк-рд╕рд╛рдЭрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╣реИ, рдФрд░ рдпрд╣ рдПрдкреАрдЖрдИ рдХреЛ рдЧрдВрджрд╛ рдХрд░ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ (рд╕реНрдореГрддрд┐ рдмреЗрдХрд╛рд░ рд╣реЛрдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рд╕рдВрдЧрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде extend рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ?

рдмрдврд╝рд┐рдпрд╛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ ES6 рдФрд░ рдмреИрдХрдмреЛрди рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдЦреЗрд▓реЗрдВрдЧреАред рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ:

  1. рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ : рдореИрдВ рдЗрд╕рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реАрдзреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЯрди рдХреЛрдб рдЯреНрд░рд┐рдк рдЕрдк рджреЗрдЦрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ES6 рдиреЗ рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪреБрдирд╛ рд╣реИред
  2. рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ : рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЕрдзрд┐рдХ рд╢рд╛рд╕реНрддреНрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдКрдкрд░ рд╕реЗ рднреА рдХрдо рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рд╣реИред
  3. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдПрдБ : Ickред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдиреА рдХрд╛ рдиреИрддрд┐рдХ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рдИрдПрд╕ 6 рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рд╕рдорд░реНрдерди рднреВрдорд┐ рддрдХред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд░реНрдЧ рдЧреБрдг рднреА super() рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдЖрддреЗ рд╣реИрдВред :рдирд┐рд░рд╛рд╢:

рд╕рдВрдЧрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ?

рдореИрдВрдиреЗ рдЗрд╕реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ? рдирд╣реАрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдмреИрдХрдмреЛрди рдХреЛ рдХреЛрдб рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬрдм ES6 рдХрдХреНрд╖рд╛рдПрдВ рдмрд┐рдирд╛ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд┐рдВрдЧ рдХреЗ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдкрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдХреЛрдб рдореЗрдВ рдХрдореА рдЕрдЧрд▓реА рд╣реЛрдЧреА рдХреБрдЫ рдирд╣реАрдВред

рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░рддрд╛ рдкрд╣рд▓реВ рдХреЛ рдХрдо рдордд рдЖрдВрдХрд┐рдПред рдпрджрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХрд╛ "рддрд░реАрдХрд╛" рдмрди рдЬрд╛рддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдореНрдмрд░/рдХреЛрдгреАрдп/рд░рд┐рдПрдХреНрдЯ/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдСрд░реЗрд▓рд┐рдпрд╛ рдЖрджрд┐ рд╕реЗ рдЗрд╕ рдкрд░ рдорд╛рдирдХреАрдХрд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдмреИрдХрдмреЛрди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдЦрдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛ рд╣реЛрдЧреА рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкред рдЦрд╛рд╕рдХрд░ рдЬреВрдирд┐рдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрд░реВрд░реА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рдВрдбрд┐рддреНрдпрдкреВрд░реНрдг "рдЫреЛрдЯреЗ рджрд┐рдорд╛рдЧреЛрдВ рдХреЗ рд╢реМрдХ" рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред

рдореИрдВ @ akre54 рдФрд░ @jridgewell рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ "рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╢рд╛рдпрдж рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдЬреЗрдПрд╕ рдирд╡рд╛рдЧрдВрддреБрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рд╕реАрдЦ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВ рдЗрди "рд╕реНрдереИрддрд┐рдХ" рдЧреБрдгреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрди рдореЗрдВ рдерд╛ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

ES7 рдореЗрдВ рд╕рд╣реА рд╡рд░реНрдЧ рдЧреБрдг рд╣реЛрдВрдЧреЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://gist.github.com/jeffmo/054df782c05639da2adb

ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╕ рдпрд╣реА рд╣реИ, рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдореБрджрд╛рдп рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ред рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдпреБрдХреНрддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг рдЧреБрдгреЛрдВ рдХреЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред (рдЙрдкрд░реЛрдХреНрдд jridgewell рдХрд╛ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ рдпрд╛ Babel 5.0.0 рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)

@jridgewell рдореИрдВ @benmccormick рдХреА рдкреЛрд╕реНрдЯ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛:

рд░рд┐рдПрдХреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкреНрд░реЙрдкрд░реНрдЯреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реАрдВ рдореБрджреНрджреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдмреИрдХрдмреЛрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 0.13 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрддреНрддрд┐ рдЖрд░рдВрднреАрдХрд░рдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрдВрддрддрдГ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ ESDiscuss рдереНрд░реЗрдб рдореЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рд╡рд╛рдИрдХреИрдЯреНрд╕ рдХрд╛ рдЬреЗрдПрд╕-рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рд╕реНрдЯреНрд░реЙрдореИрди рдпрд╛ рдореВрд▓ (рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд) рд╕рджреНрднрд╛рд╡ рд╡рд░реНрдЧ рдкреНрд░рд╕реНрддрд╛рд╡ ред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

class Row extends Backbone.View {
  get tagName() { return 'li'; }
}

рдПрдХ рдкреВрд░реНрдг рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдпрд╛ рд╕реНрдерд┐рд░ рдкреНрд░реЛрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ a la _.result :

_.instOrStaticVar = function(instance, property) {
  if (instance == null) return void 0;
  var value = instance[property] || instance.constructor[property];
  return _.isFunction(value) ? value.call(instance) : value;
}

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди:

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдпрд╣рд╛рдВ рдмреИрдХрдмреЛрди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рддреЛ, ES5'd:

// ES6
class View extends Backbone.View {
  tagName = 'li';

  constructor() {
    // Do anything that doesn't touch `this`
    super();
    // Do anything that touches `this`
  }
}

// ES5
function View() {
  // Do anything that doesn't touch `this`
  Backbone.View.apply(this, arguments);

  // Add class properties
  this.tagName = 'li';

  // Do anything that touches `this`
}
View.prototype = _.create(Backbone.View.prototype, {
  constructor: View
});

рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░рд╛ рддрддреНрд╡ рдЕрднреА рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рд╡рд╛рдИрдХреИрдЯреНрд╕ рдХрд╛ рдЬреЗрдПрд╕-рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рд╕реНрдЯреНрд░реЙрдореИрди...

рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ?

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

:+1:. рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╣реА рдирд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ

рдПрдХ рдкреВрд░реНрдг рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдпрд╛ рд╕реНрдерд┐рд░ рдкреНрд░реЛрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ a la _.result:

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...

рддреБрдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рдереЗ:

class MyView extends Backbone.View {
  constructor() {
    super({ tagName: 'h1' });
    this.el.textContent = 'Hello World';
  }
}

@thejameskyle рд╡рд╣ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред :рдЕрдЯрдХ_рдмрд╛рд╣рд░_рдЬреАрдн:

рдХрдХреНрд╖рд╛ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП super() рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╕ init() рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

class DocumentRow extends Backbone.View {

    constructor() {
        super();
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        this.init();
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

@milesj рд╣рдореНрдо? рдпрд╣ рдЕрдВрддрд┐рдо ES6 рд╡рд░реНрдЧ рдХрд▓реНрдкрдирд╛ рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛

рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реБрдкрд░ () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рднреА рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреИрдХрдмреЛрди рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХрд╛ рдпрд╣ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ: http://www.2ality.com/2015/02/es6-classes- final.html

@milesj : рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдЖрдкрдХреЛ this.tagName рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ super() рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░, рдЪреВрдВрдХрд┐ рд╣рдо рд╡реНрдпреВ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЛ this.tagName рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рддрддреНрд╡ рдмрдирд╛ рдЪреБрдХреЗ рд╣реИрдВред

рдЬрдм рдЖрдк рд╕рдмрдХреНрд▓рд╛рд╕рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддрдм рднреА

@jridgewell рдУрд╣ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд╡рд╣ рдпрд╛рдж рдЖрдпрд╛ред рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЗрдлреНрдореЛ рдФрд░ рдПрд╕рдИрдмреАрдПрдордХреЗ рд╕реЗ рдмрд╛рдд рдХреАред

рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдХреБрдЫ рдмреИрдХрд╕реНрдЯреЛрд░реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рджреЗрд╢реА рдкреНрд░рдХрд╛рд░реЛрдВ (рдпрд╛рдиреА рдРрд░реЗ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП this рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк super() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗред рдЕрдиреНрдпрдерд╛ рдЖрдк рдбреАрдУрдПрдо (рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ) рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВред

@jridgewell @thejameskyle рддреЛ рдмрд╕ рдлреЛрди рд╕реБрдкрд░ () рдкрд╣рд▓реЗ (рдЕрджреНрдпрддрди рдЙрджрд╛рд╣рд░рдг)ред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА ES6 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╡рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдмрд╕ рд╡реНрдпреВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓реЙрдЬрд┐рдХ рдХреЛ init() рдореЗрдердб рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБред

рдпрд╣ рдПрдХ рд╣реИ рдмрд╣реБрдд рдмрд╣реБрдд рд╕реЗ рдорд╣рдВрдЧрд╛ рдХреЛрдб рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

@milesj рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореВрд▓ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкрдврд╝реА? рд╕реБрдкрд░ рдлрд░реНрд╕реНрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреБрдг рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдкреВрд░реА рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: http://benmccormick.org/2015/04/07/es6-classes-and-backbone-js/

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЕрднреА рднреА рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред рд╣рд░ рдХреЛрдИ рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдРрд╕рд╛ рд╣реА рд╣реЛред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ (рдпрджреНрдпрдкрд┐ рдереЛрдбрд╝рд╛ рд╕рд╛ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)?

var View = Backbone.View = function(options) {
    this.cid = _.uniqueId('view');
    // extend()ing options is no longer needed if properties are set directly
};

View.prototype.setup = function() {
    this._ensureElement();
    this.initialize.call(this, arguments);
};

class DocumentRow extends Backbone.View {
    constructor() {
        super();
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        this.setup(...arguments);
    }
}

рдореИрдВ рдЧреИрд░-рдИрдПрд╕ 6 рдХреЗ рд╕рд╛рде рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ?

рддрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ View рд╡рд░реНрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдХрднреА рднреА #setup рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░, super() рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рд╕рдмрдХреНрд▓рд╛рд╕ рдХреЙрд▓ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╕рднреА ES6 рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рдкрдЯрдирд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдмреИрдХрдмреЛрди рд╕реЗред рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ Babel ES7 рд╡рд░реНрдЧ рдЧреБрдг рдпреБрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ред

@milesj рдЬреИрд╕рд╛ рдХрд┐ ES7 рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрдд рддрдХ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ jeffmo рдФрд░ sebmck рд╕реЗ рдмрд╛рдд рдХреА:

class Root {
  rootProp = 'root';
  constructor() {
    console.log('Root', this.rootProp);
    console.log('Root', this.derivedProp);
  }
}

class Derived extends Root {
  derivedProp = 'derived';
  constructor() {
    super();
    console.log('Derived', this.rootProp);
    console.log('Derived', this.derivedProp);
  }
}

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП desugaring:

function Root() {
  this.rootProp = 'root';
  console.log('Root', this.rootProp);
  console.log('Root', this.derivedProp);
}

function Derived() {
  super();
  this.derivedProp = 'derived';
  console.log('Derived', this.rootProp);
  console.log('Derived', this.derivedProp);
}

рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрднреА рднреА рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрд╕рдВрдЧрддрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ:

new Derived();
// >> 'Root' 'root'
// >> 'Root' undefined
// >> 'Derived' 'root'
// >> 'Derived' 'derived'

рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╕рднреА ES6 рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рдкрдЯрдирд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдмреИрдХрдмреЛрди рд╕реЗред

рд╣рдореНрдо?

рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ Babel ES7 рд╡рд░реНрдЧ рдЧреБрдг рдпреБрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ред

рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ DIV рддрддреНрд╡ рд╣реЛрдВрдЧреЗ рдЬрд┐рдирдореЗрдВ рдХреЛрдИ className s рдирд╣реАрдВ рд╣реЛрдЧрд╛ред https://github.com/jashkenas/backbone/issues/3560#issuecomment -90739676, https://github.com/jashkenas/backbone/issues/3560#issuecomment -91601515 рдФрд░ https://github рдХрд╛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВред

рдЕрдЪреНрдЫрд╛ рдРрд╕рд╛ рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ "рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ" рд╡рд┐рдХрд▓реНрдк, рдпрд╛ "рдЧреБрдг" рд╡рд┐рдзрд┐ (рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рд╣реИред

class DocumentRow extends Backbone.View {
    loadProperties() {
        return {
            tagName: 'li',
            className: 'document-row',
            events: {
                "click .icon": "open",
                "click .button.edit": "openEditDialog",
                "click .button.delete": "destroy"
            },
            foo: 'bar'
        };
    }
}

// Contrived example
var View = Backbone.View = function(options) {
    this.cid = _.uniqueId('view');
    options || (options = {});
    _.extend(this, this.loadProperties(), _.pick(options, viewOptions));
    this._ensureElement();
    this.initialize.apply(this, arguments);
};

рдореИрдВрдиреЗ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/titon/toolkit/issues/107

рдирдорд╕реНрддреЗред

рдЕрдЧрд░ рдореИрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ - рдмреИрдХрдмреЛрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрдмреА рдХреЛрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ? (рдореИрдВ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рд┐рдП, рдФрд░ рди рд╣реА рдореБрдЭреЗ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреНрдпрд╛ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рд╡рд┐рд╖рдп рдкрд░ рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред

@gotofritz рд╣рдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ES6 рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЬреАрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреИрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИред рдмреИрдХрдмреЛрди рдХрд╛ рдХреНрд▓рд╛рд╕ рд╕рд┐рд╕реНрдЯрдо рдпрд╣рд╛рдВ рд╕рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

ES7 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдареЛрд╕ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдмреАрдЪ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдмреИрдХрдмреЛрди рдХреЗ extend рд╕рд╛рде рд░рд╣реЗрдВред

рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП ES6 рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛... :-)

рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдореБрдЭреЗ "рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ" рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдРрдк рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ (рд╕реНрдерд╛рдиреАрдпрдХреГрдд) рдорд╛рд░реНрдЧ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рддрддреНрдХрд╛рд▓ рд╕рдордп рдкрд░ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдорд╛рд░реНрдЧ () рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓рддрд╛ред рдЬрдмрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ

class Router extends Backbone.Router {

 constructor (localizedRoutes) {
    _.defaults(localizedRoutes, {
        "nonLocalizedRouteA/": "routeA"
        "*actions": "defaultRoute"
     });
 super({ routes: localizedRoutes });
}

рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХреЗ рдкрд╛рд╕ idAttribute рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛рдордХрд╛рдЬ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдмреИрдХрдмреЛрди рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП model.idAttribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдореЙрдбрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рдордХрд╛рдЬ idAttribute рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдЙрддреНрдХреГрд╖реНрдЯ рдкрдХрдбрд╝, рдореИрдВ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рдЖрдк рдХрд╕реНрдЯрдо idAttribute (рдФрд░ cidPrefix ) рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯреНрдЯрд░ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

class Model extends Backbone.Model {
  get idAttribute() {
    return '_id';
  }

  get cidPrefix() {
    return '__c';
  }
}

рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдмреИрдХрдмреЛрди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП model.idAttribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

get idAttribute() { return '_id'; } рдПрдХ рдЧреЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреА рддрд░рд╣ рд╣реА рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред this.idAttribute === '_id'; ред

рдРрд╕рд╛ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреИрдХрдмреЛрди v2 рд╢рд╛рдпрдж?

рдРрд╕рд╛ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреИрдХрдмреЛрди v2 рд╢рд╛рдпрдж?

рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ES6 рдЙрдкрд╡рд░реНрдЧ ( рдореЙрдбрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ @ akre54 рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рд╕реБрдЭрд╛рд╡ рдХреА рдЦреЛрдЬ рдХреА , рд▓реЗрдХрд┐рди рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рджреЛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

@jridgewell , рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпреЗрд╣реБрджрд╛ рдХрд╛рдЯреНрдЬрд╝ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ ), рдФрд░ рдпрд╣ рдЕрдирд╕реБрд▓рдЭрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЙрдирдХреЗ рд╕рд╛рде рдмрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

function props(value) {
    return function decorator(target) {
        _.extend(target.prototype, value);
    }
}

рдФрд░ рдлрд┐рд░ рд╣рдо рдЬрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

@props({
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      }
    })
class DocumentRow extends Backbone.View {

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ

class DocumentRow extends Backbone.View {

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}
_.extend(DocumentRow.prototype, {
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      }
})

рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реНрдерд┐рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЛрдк рджреЛрдиреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкреВрд░реА рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдХреЛ рд╕рдЬрд╛рд╡рдЯреА

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдмреИрдмреЗрд▓ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЭрдВрдбреЗ рдХреЗ рдкреАрдЫреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд▓реЛрдЧ рд░реЛрдорд╛рдВрдЪ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИред

@benmccormick , рдбреЗрдХреЛрд░реЗрдЯрд░ рддрдХрдиреАрдХ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ?

@andrewrota рдореИрдВ рд╕рдЪрдореБрдЪ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЕрднреА рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ (рдЬрдм рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереА рддреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рдерд╛)ред рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ "рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛" рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреЛрдИ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдмреИрдХрдмреЛрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

@StevenLangbroek рдХрд╛ рдпрд╣ рд╕рд╛рд░ рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдкрд░ https://gist.github.com/StevenLangbroek/6bd28d8201839434b843

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓реА рдЬрд╛ рд░рд╣реА рдЕрдиреБрд╡рд░реНрддреА рдкреЛрд╕реНрдЯ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: http://benmccormick.org/2015/07/06/backbone-and-es6-classes-revisited/ рдЕрдм рд╕реНрдерд╛рдпреА рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдпрд╣ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп рд╕реНрдерд╛рдпреА url рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реВрддреНрд░ рдХрд╛ рдореВрд▓ рд╕рд╛рд░рд╛рдВрд╢ рдФрд░ рдЬреЛ рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рд╣реИ рд╡рд╣ рд╣реИ:

рдмреИрдХрдмреЛрди рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдХреЛ рдореМрдЬреВрджрд╛ ES6 рдХреНрд▓рд╛рд╕ рд╕реНрдкреЗрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3 рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ (рдкрд╣рд▓реЗ 2 рдХреЛ # 3684 рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП):

  1. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╕реБрдкрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ
  2. рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ
  3. рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ

рдореИрдВ рдЕрднреА рднреА рдЗрди рд╕рднреА рдХреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд╣рдж рддрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╕рдорд╕реНрдпрд╛ рдХрдореЛрдмреЗрд╢ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде 2 рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

  1. рдПрдХ рдкреНрд░реЙрдкреНрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝ рджреЗ
  2. рдХрдИ рд╡рд┐рд╢реЗрд╖ рдЙрджреНрджреЗрд╢реНрдп рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдХ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ/рд╕реБрдХреНрд╖реНрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП #3684 рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмреИрдХрдмреЛрди рдореЗрдВ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреИрдХрдмреЛрди-рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рднреВрдорд┐рдХрд╛ рд╣реЛрдЧреА рдпрджрд┐/рдЬрдм рдбреЗрдХреЛрд░реЗрдЯрд░ рдорд╛рдирдХреАрдХреГрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдкреЛрд╕реНрдЯ рдкрд░ рд╕реЛрдорд╡рд╛рд░/рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╕рдВрдж рдЖрдПрдЧреАред

@benmccormick рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕рд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рднреА: рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЦ рдзрдиреНрдпрд╡рд╛рдж :) рдЬрдм рдЖрдк рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдкрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ? :+1:

рд╣рдо рдореИрд░рд┐рдпрдиреЗрдЯ рдореЗрдВ modelEvents рдФрд░ collectionEvents рд▓рд┐рдП рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ (рдЬреИрд╕реЗ рдЖрдкрдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЯреИрдЧрдирд╛рдо рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛: рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдпрд╛ рд╡рд╣ рдмреИрдХрдмреЛрди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрднреА рднреА рд╕реНрдЯреЗрдЬ 0 рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмреИрдХрдмреЛрди рдРрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░реАрди рдЕрдкрдЧреНрд░реЗрдб рд╣реЛрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрд╢ рдкрд░ рдореЗрдердб рдбреЗрдХреЛрд░реЗрдЯрд░, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓ рдХреА рддрд░рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЧреНрд░рдВрдЯ рдкрд░ рднреА рдЧрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред

@StevenLangbroek рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджреЗрдЦреЗрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рддрд╛ рд╣реИред рд╕реБрдкрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЙрди рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

@benmccormick , рдкреЛрд╕реНрдЯ рдЕрдЪреНрдЫреА рд▓рдЧ рд░рд╣реА рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрдб рдСрдл рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдпреЛрдЬрди рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЗрд╕реЗ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ @benmccormick рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде _#extend рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд┐рд░ @akre54 рдХреА _.instOrStaticVar рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ _#result рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдИрдПрдордПрдЪрдУ рдЗрд╕ рддрд░рд╣ рд╕рд╛рдл рд╣реИред рдЬреИрд╕реЗ @ akre54 рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк-рд╕рд╛рдЭрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдпрд╛рдиреА рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рд╣реИрдВ) рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдореИрдВ рдЖрдЧреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдЧреБрдг рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рднреА рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╡рд┐рд╢реЗрд╖ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдЬрд╛рдП рдЧрдП рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

class TodoView extends Backbone.View {
  <strong i="6">@protoprop</strong>
  static tagName = 'li';
}

function protoprop(target, name, descriptor) {
  target.prototype[name] = descriptor.initializer()
}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдмреЗрдмреЗрд▓ рдЖрд░рдИрдкреАрдПрд▓ рджреЗрдЦреЗрдВред рдпрд╣ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЪреАрдЬреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ рдЬрд╕реНрдЯ-рдмреЛрд░рд┐рд╕ рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдЖрдк рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реНрдкреЗрдХреНрд╕ рдХреЗ рдмреИрдмреЗрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред рдЕрднреА рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрдХреНрд╖рд╛ рдЧреБрдгреЛрдВ рдкрд░ рд╕рдЬрд╛рд╡рдЯреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдФрд░/рдпрд╛ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рд╡реНрдпрд╡рд╣рд╛рд░ред рдЕрдиреНрдпрдерд╛ рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдХрд┐рд╕реА рднреА рд╕рдордп рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╢рд╛рдпрдж рд╣реЛрдЧрд╛)ред

@benmccormick wycats/рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ

рд╡рд╣рд╛рдВ рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ рднреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рдЙрдиреНрд╣реЗрдВ рднреА рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛, рдЬрдмрдХрд┐ рдЙрд╕ рдЦрдВрдб рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИ

рдЖрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдореИрдВрдиреЗ рд╡рд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ред рдпрд╣ рдмрд╛рдд рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕реЛрдо, 21 рд╕рд┐рддрдВрдмрд░, 2015 рдХреЛ рдкреВрд░реНрд╡рд╛рд╣реНрди 11:29 рдмрдЬреЗ, рдмреЛрд░рд┐рд╕ рд╕рд░реНрдбрд┐рдпреБрдХ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@benmccormick https://github.com/benmccormick
https://github.com/wycats/javascript-decorators рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ
рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛
https://github.com/wycats/javascript-decorators/blob/master/INITIALIZER_INTEROP.md
.

рд╡рд╣рд╛рдВ рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИ,
рд╕рд╛рде рд╣реА рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ, рддрд╛рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЙрдиреНрд╣реЗрдВ рднреА рд▓рдкреЗрдЯ рд╕рдХреЗрдВред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛
рдЪрд┐рдВрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдЬрдмрдХрд┐ рдЙрд╕ рдЦрдВрдб рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИ

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/jashkenas/backbone/issues/3560#issuecomment -142015454
.

рдмрд╕ https://github.com/typhonjs/backbone-es6 рдмрдирд╛рдо @benmccormick рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ/рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ , рдЙрддреНрдХреГрд╖реНрдЯ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдкреНрд░рд╕реНрддрд╛рд╡ (#121) рдкреБрд▓-рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣рд╛рдВ properties рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд┐рдзрд┐ https://github.com/dsheiko/backbone-abstract/tree/master/demo-es6/src/Js
рдЬреИрд╕рд╛ рдХрд┐ @ akre54 рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╕реНрдЯрд┐рди рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди ( preInitialize рд╡рд┐рдзрд┐) рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдореЗрд░реА рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╡реЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВред

PS preInitialize рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред рдпрджреНрдпрдкрд┐, рдпрд╣ preConstruct рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рд╕рднреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдиреМрдХрд░рд┐рдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЧреБрдг рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦреЗрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрдИ рд▓реЛрдЧ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ рд╕реАрдзреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЬреЗрдлрдореЛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдиреНрд╣реЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рд╡реЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реАрдзреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЧрдП рдереЗ рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рдмреИрдХрдмреЛрди рдХреЛрдб рдХреЛ ES2015 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ @benmccormick !! рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрди рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

@benmccormick , рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ https://github.com/epicmiller/es2015-default-class-properties

рдпрд╣ рдХрд┐рд╕реА рднреА рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрддрд╛ рд╣реИ, рдФрд░ _far_ рдЙрдиреНрд╣реЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдпрд╛ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдФрд░ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде ES2016/ES2017 рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЖрдиреЗ рдХреЗ рд╕рд╛рде рдпрд╣ рдмреИрдХрдмреЛрди рдХреЗ рд▓рд┐рдП рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрдХрд╛рджрдорд┐рдХ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ рдпрджрд┐ 2-3 рд╕рд╛рд▓ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ рд░реБрдХреЛред

рдЦреИрд░, рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрдорд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрдЯреЗрдЬ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдЕрднреА рднреА рд╕реНрдЯреЗрдЬ 1 рдкрд░ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ" рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЙрдкрд╣рд╛рд░ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛ рдФрд░ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

https://github.com/tc39/ecma262
https://github.com/jeffmo/es-class-fields-and-static-properties

рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдкрд░ рдореБрдЭреЗ https://github.com/epicmiller/es2015-default-class-properties рдПрдХ рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд┐рд▓рддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдмреИрдХрдмреЛрди рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдкреЛрд░реНрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

class MyModel extends Backbone.Model.extend({
   idAttribute: 'id'
}) {
   // ...
};

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб MyModel.prototype.idAttribute рдХреЛ рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ ES6 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ ...

@ рдЯреА-рдмреЗрдХрдореИрди рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ - рдкрдардиреАрдп рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдиреНрдпреВрдирддрдо рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдЕрдм 2 рд╕рд╛рд▓ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреИрдХрдмреЛрди рдФрд░ рдИрдПрд╕ 6 рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЕрднреА рднреА рд╢реАрд░реНрд╖ (рдФрд░ рдХреЗрд╡рд▓) рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдХрдИ рдмрд╛рд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ .

рдЕрдм рдЬрдмрдХрд┐ рд╡рд░реНрдЧ рдЧреБрдг рдЪрд░рдг 2 рдореЗрдВ рд╣реИрдВ рдФрд░ рдмреЗрдмреЗрд▓ рдкреНрд░реАрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдФрд░ рд░реВрдк рджреВрдВрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг/рд╕рджрд╕реНрдп рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ _after_ constructor() рддрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдИ рдЧреБрдг рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рднреАрддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕реНрдереИрддрд┐рдХ рдЧреБрдг рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди (рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛) рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд┐рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЧреБрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореВрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣реИрдХ рд╣реИ, рдореИрдВ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдВ:

рд╢рд┐рдо:

export default function StaticShim(Ctor) {
    const NewCtor = function shim(...args) {
       Object.keys(Ctor).forEach((key) => {
            if (this[key] === undefined) {
                this[key] = toApply[key];
            }
        });

        Object.assign(this, this.constructor);

        Ctor.apply(this, args);
    };

    NewCtor.prototype = Object.create(Ctor.prototype);
    NewCtor.prototype.constructor = NewCtor;

    Object.keys(Ctor).forEach((key) => {
        if (NewCtor[key] === undefined) {
            NewCtor[key] = Ctor[key];
        }
    });

    return NewCtor;
}

рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ:

class TestModel extends StaticShim(Backbone.Model) {
    static idAttribute = '_id';
    static urlRoot = '/posts';

    initialize() {
        console.log(this.url()); // Correctly logs "/posts/{id}"
    }
}

рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рддреЛ рдмрд╕ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдПрдХ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рдЦреЗрдж рд╣реИред

рдХреНрдпрд╛ рдмреИрдХрдмреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ ES6 рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдмреИрдмрд▓ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред*.extend({...})?

@enzious рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ :)

@ рдЯреА-рдмреЗрдХрдореИрди рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рд╕реАрдзрд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕реЗ рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдореЗрдВ рд╣реА рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреНрдпрд╛ idAttribute рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрджрд┐ Promise рд╕рдорд░реНрдерди рд╣реИ рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ред рдЬреЛ jQuery Deferred рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмреИрдХрдмреЛрди рдХреЗ рднреАрддрд░ рдмрд╣рд┐рд╖реНрдХреГрдд рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдЖрдзреБрдирд┐рдХ рдЯреВрд▓рд┐рдВрдЧ рдФрд░ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдмреИрдХрдмреЛрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрд╣рд╛рдиреА рдЕрднреА рднреА рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдХрд┐ Symbol.iterator рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЙрддреНрдкрд╛рджрди рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЙрддреНрддрд░ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ, рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдмреИрдХрдмреЛрди рдРрдк рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рдпрд╛ред

рдЕрдм рддрдХ рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрдЪреНрдЫреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрдЬрд╛рдп рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреА рдХрдореА рдХреЗ рд╕рд╛рдеред

export function Props<T extends Function>(props: { [x:string]: any }) {
  return function decorator(ctor: T) {
    Object.assign(ctor.prototype, props);
  };
}

@Props({
  routes: {
    home: "home",
    about: "about",
    dashboard: "dashboard",
    blog: "blog",
    products: "products",
    accountSettings: "accountSettings",
    signOut: "signOut",
  },
})
export class Router extends Backbone.Router {
  home() {}
  about() {}
  // ...
}

@Props({
  model: CategoryModel,
  comparator: (item: CategoryModel) => item.display_value,
})
export class CategoryCollection extends Backbone.Collection<CategoryModel> {}

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕рдВрдкрддреНрддрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

image

@raffomania , @jridgewell & Co., рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореЗрд░реА рдЯреАрдо рдиреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ idAttribute рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдврд╝рд╛рддрд╛ рд╣реИ {
// рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ рдЖрджрд┐ рдпрд╣рд╛рдБ
}

x.рдЙрджрд╛рд╣рд░рдг = рдЙрджрд╛рд╣рд░рдг;

x.Example.prototype.idAttribute = 'customIdAttr';

@kamsci рдореИрдВрдиреЗ рдЗрд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╡рд╣реА рдХрд┐рдпрд╛ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдмреИрдХрдмреЛрди рдХреЛ ES6 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ _declarative_ рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдмреИрдХрдмреЛрди _configuration_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдХрднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред (рдХрдХреНрд╖рд╛ рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдирд╣реАрдВ рд╣реИред)

рдпрджрд┐ рд╣рдо рдмреИрдХрдмреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪрдирд╛ рдареАрдХ рд╣реИред ES5 рдХреЛрдб рдХреЛ рдХрд╛рдЯрдирд╛ рдФрд░ рдЪрд┐рдкрдХрд╛рдирд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ ES6 рдЬреИрд╕рд╛ рджрд┐рдЦрд╛рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ рдХреНрдпрд╛ рд╣реБрдЖ?

рдореБрдЭреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдмрдХреБрдЫ рдореЗрдВ рдЧреБрдЬрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреИрд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдкрдврд╝рдирд╛/рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд░реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдХреЛрдИ рднреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИред рд▓реЗрдХрд┐рди, рдХрд╛ рдкреИрдЯрд░реНрди

Foo = BackboneThing.extend({LONG DECLARATIVE OBJECT LITERAL}) рдорд╛рдБ-рдкреНрд░реЗрдореА рднреА рдмрджрд╕реВрд░рдд рд╣реИред рдЖрдк рд╕рднреА рдЗрд╕реЗ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдирд╣реАрдВ рджреЗрдЦрддреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдмрджрд╕реВрд░рдд рд╣реИред

рдПрдлрд╡рд╛рдИрдЖрдИ: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝реА рдореИрд░рд┐рдпрдиреЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ ES6 рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рдПрдХ рдЬреЗрдПрд╕рдХреЛрдбрд╢рд┐рдлреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдмрдирд╛рдпрд╛ рдЬреЛ рдмреИрдХрдмреЛрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдИрдПрд╕ 6 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрд╣ рдХрдИ рд╕рд░рд▓ рдзрд╛рд░рдгрд╛рдПрдБ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ @ t-beckmann рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдерд╛ред
https://gist.github.com/maparent/83dfd65a37aaaabc4072b30b67d5a05d

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рдорд┐рдереНрдпрд╛ рдирд╛рдо рд╣реИред ES6 рдХреЗ рд▓рд┐рдП 'рд╕реНрдерд┐рд░ рдЧреБрдг' рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рдореМрдЬреВрдж рдЧреБрдг рд╣реИрдВ рдЬреЛ рдмрд┐рдирд╛ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Class.extend)ред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ 'рд╕реНрдереИрддрд┐рдХ рдЧреБрдг' рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдирд╛рдорд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ 'рд╕реНрдереИрддрд┐рдХ' рдорд╛рди (рдЧреЗрдЯрд░реНрд╕ рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рдЕрдзрд┐рдХрд╛рд░ рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ?

рд╕реНрдерд┐рд░ рдорд╛рди рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдмреИрдХрдмреЛрди рдкреНрд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╡реИрд▓реНрдпреВ рдХреЛ рдлрдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕реАрдзрд╛ рд╕рдВрдХреНрд░рдордг рд╣реИ рдФрд░ _.result рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдлреЙрд▓реНрдЯреНрд╕, рдХреНрд▓рд╛рд╕рдирд╛рдо, рдЖрдИрдбреА рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рдЕрдиреНрдп рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЧреБрдг рдареАрдХ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдлрдВрдХреНрд╢рди рдХрд╛ рд╢реАрд░реНрд╖ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ES6 рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рд░ рдорд╛рди рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЧреЗрдЯрд░реНрд╕, рд╕реЗрдЯрд░реНрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдирд┐рд░реНрдорд╛рддрд╛/рд╡рд░реНрдЧ рд╕реНрдерд┐рд░ рдЧреБрдг (Class.extend) рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ ES6 рдореЗрдВ рд╣реИрдВред рдмреИрдХрдмреЛрди рд╣рд░ рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рд╕реНрдЯреИрдЯрд┐рдХ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдХреЛ рдирдП рдХреНрд▓рд╛рд╕/рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдЗрди рдЧреБрдгреЛрдВ рдХреЛ ES6 рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХреНрд╕рдЯреЗрдВрдб рдлрдВрдХреНрд╢рди рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рдмрдирд╛рдпрд╛ рд╣реИ https://github.com/jashkenas/backbone/pull/4235

рдореИрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рднреА рддреЛрдбрд╝ рджреЗрдЧрд╛, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмреИрдХрдмреЛрди рдХреНрд▓рд╛рд╕реЗрд╕ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп Class.extend рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреА рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zowers picture zowers  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rafde picture rafde  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cueedee picture cueedee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rubiii picture rubiii  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alundiak picture alundiak  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ