Backbone: ๋ฐฑ๋ณธ ๋ฐ ES6 ํด๋ž˜์Šค

์— ๋งŒ๋“  2015๋…„ 04์›” 07์ผ  ยท  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() {
        //...
    }
}

ํ˜„์žฌ ํ™•์žฅ ๊ตฌ๋ฌธ๊ณผ ๋น„๊ต

์ƒ์„ฑ์ž๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰

๋‹ค๋ฅธ cid ๋“ฑ์œผ๋กœ ๋‘ ๋ฒˆ์งธ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ๋กœ ์ธํ•ด ์ด๊ฒƒ์„ ์‹ค์ œ ์˜ต์…˜์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์†์„ฑ์„ ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌ

์ด๊ฒƒ์€ ๋‚ด ๋ธ”๋กœ๊ทธ์˜ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ด๋ฉฐ ์•„๋งˆ๋„ ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ํ˜„์žฌ ์˜ต์…˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

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;
  }
}

์ด๋Ÿฌํ•œ ํ˜„์žฌ ์˜ต์…˜์€ ๋ชจ๋‘ ํ˜„์žฌ Backbone ํ™•์žฅ ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช…ํ™•ํ•œ ํƒ€ํ˜‘์„ ํฌํ•จํ•˜๋ฏ€๋กœ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚ด ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋งˆ์Œ์— ๋– ์˜ค๋ฅธ ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” ์†์„ฑ ํ•ด์‹œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” "์†์„ฑ" ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ƒ์„ฑ์ž๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒ์„ฑ์ž๊ฐ€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์„ ์ฝ์œผ๋ฉด์„œ https://github.com/epicmiller/es2015-default-class-properties ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•  ๋•Œ Backbone์— ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

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

์œ„์˜ ์ฝ”๋“œ๋Š” MyModel.prototype.idAttribute๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. TypeScript์˜ ๊ฒฝ์šฐ ์„ ์–ธ ํŒŒ์ผ์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜์—ฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Š” ES6 ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ์ด ์—†๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค...

๋ชจ๋“  63 ๋Œ“๊ธ€

์˜ˆ, ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์‹คํŒจ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฆฌ ์ž‘์—…์„ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์•ผ๊ธฐ์˜ ๊ตํ›ˆ์€ ์ตœ์†Œํ•œ ์ •์  ์†์„ฑ ์ง€์›์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ๊นŒ์ง€ Backbone๊ณผ ํ•จ๊ป˜ ES6 ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋Œ€์ฒด ์˜ต์…˜ ์ค‘ ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜์€ ๋ฌธ์ž์—ด/๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Backbone API ๋””์ž์ธ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์€ ์ด๋Ÿฌํ•œ ํ”„๋กœํ† ํƒ€์ž… ๊ณต์œ  ๋ฌธ์ž์—ด๊ณผ ๊ฐ์ฒด์— ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑ์ž์˜ ์ธ์Šคํ„ด์Šค์— ๊ฐ ์†์„ฑ์„ ํ• ๋‹นํ•˜๋„๋ก ์š”๊ตฌํ•˜๋ฉด API๊ฐ€ ๋”๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ ).

์ผ๊ด€์„ฑ ์™ธ์—๋„ extend Backbone๊ณผ ํ•จ๊ป˜ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ›Œ๋ฅญํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ž…๋‹ˆ๋‹ค. ES6๊ณผ Backbone ํด๋ž˜์Šค๊ฐ€ ํ•จ๊ป˜ ํ”Œ๋ ˆ์ดํ•˜๋Š” ๋ฐฉ์‹์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์†”๋ฃจ์…˜์— ๊ด€ํ•ด์„œ:

  1. ๋ชจ๋“  ์†์„ฑ์„ ํ•จ์ˆ˜๋กœ ์—ฐ๊ฒฐ : ์ €๋Š” ์ด์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์— ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊นจ๋—ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ๋งŽ์€ ์ฝ”๋“œ ํŠธ๋ฆฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ฉด์—ญ์ด๋ฏ€๋กœ ES6์ด ํด๋ž˜์Šค ์†์„ฑ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ์†์„ฑ์„ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌ : ์ด๊ฒƒ์ด ๋ณด๋‹ค ๊ณ ์ „์ ์ธ ์–ธ์–ด๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์ด ์œ„์˜ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  3. ์ƒ์„ฑ์ž๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค .

์ด์•ผ๊ธฐ์˜ ๊ตํ›ˆ์€ ์ตœ์†Œํ•œ ์ •์  ์†์„ฑ ์ง€์›์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ๊นŒ์ง€ Backbone๊ณผ ํ•จ๊ป˜ ES6 ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์†์„ฑ๋„ super() ํ˜ธ์ถœ ๋’ค์— ์˜ต๋‹ˆ๋‹ค. :์‹ค๋งํ•œ:

์ผ๊ด€์„ฑ์„ ์ œ์™ธํ•˜๊ณ  Backbone over expand์™€ ํ•จ๊ป˜ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ์—์„œ ์ด๊ฒƒ์„ ๋‹ค๋ฃจ์—ˆ๋‹ค. ๊ฑฐ์˜? ์•„๋‹ˆ์š”. ์ด๋ก ์ƒ์œผ๋กœ๋Š” ๋ฐฑ๋ณธ์ด ์žฅ๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ์™€ ์ถ”๊ฐ€ ๊ฐœ๋…์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์‹ค์ ์œผ๋กœ ES6 ํด๋ž˜์Šค๊ฐ€ ํŠธ๋žœ์ŠคํŒŒ์ผ ์—†์ด ๋ชจ๋“  ๊ด€๋ จ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„๋ฆฌ ์ง€์›๋˜๊ธฐ๊นŒ์ง€๋Š” ์ ์–ด๋„ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ฉฐ ์ฝ”๋“œ ์ถ•์†Œ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๊ด€์„ฑ ์ธก๋ฉด์„ ๊ณผ์†Œํ‰๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์ด JavaScript์—์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” "๋ฐฉ๋ฒ•"์ด ๋œ๋‹ค๋ฉด(Ember/Angular/React/Typescript/Aurelia ๋“ฑ์—์„œ ํ‘œ์ค€ํ™”๊ฐ€ ์ฃผ์–ด์กŒ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž„), Backbone์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์˜ต์…˜. ํŠนํžˆ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ. ๊ทธ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋ณ€ํ™”ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜„ํ•™์ ์ธ "์ž‘์€ ๋งˆ์Œ์˜ ๋„๊นจ๋น„" ์ผ๊ด€์„ฑ์„ ์œ„ํ•œ ๊ฒƒ๋งŒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@akre54 ๋ฐ @jridgewell ์— "๋ชจ๋“  ์†์„ฑ์„ ๊ธฐ๋Šฅ์œผ๋กœ ์—ฐ๊ฒฐ" ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋งˆ๋„ ์ œ์•ˆ๋œ ์˜ต์…˜ ์ค‘ ์ตœ๊ณ ์ผ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. FWIW, ์›๋ž˜ ์ƒ๋Œ€์ ์ธ js ์ดˆ๋ณด์ž๋กœ์„œ ๋ฐฑ๋ณธ์„ ๋ฐฐ์šธ ๋•Œ ์ด๋Ÿฌํ•œ "์ •์ " ์†์„ฑ๊ณผ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

ES7์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ํด๋ž˜์Šค ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/jeffmo/054df782c05639da2adb

ES7 ์ œ์•ˆ์€ ๋‹จ์ง€ ์ดˆ๊ธฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฃผ๋„ ์ œ์•ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ณต์‹ ์‚ฌ์–‘์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ธ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์€ ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋œ ํ›„ ์†์„ฑ์ด ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€๋˜๋„๋ก ํ•˜๋ฏ€๋กœ Backbone์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์œ„ jridgewell์˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ Babel 5.0.0์œผ๋กœ ์ง์ ‘ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค)

@jridgewell ๋‚˜๋Š” ํฌ์ŠคํŠธ์˜ '@benmccormick์˜์ด ๋ถ€๋ถ„์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค :

React ๊ฐœ๋ฐœ์ž๋Š” Backbone ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘ํ•˜๋Š” ์†์„ฑ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ฃผ๋ชฉํ–ˆ์Šต๋‹ˆ๋‹ค. React ๋ฒ„์ „ 0.13์˜ ์ผ๋ถ€๋กœ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์†์„ฑ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋ฉฐ ์ด๋Š” ๊ฒฐ๊ตญ ํ‘œ์ค€ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ESDiscuss ์Šค๋ ˆ๋“œ ์— ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ‘œ์ค€์€ ์•„์ง ์ž‘์—… ์ค‘์ด์ง€๋งŒ Babel 5.0.0์—์„œ ์‹คํ—˜ ์ง€์› ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ•ด๋‹น ๋ฒ„์ „์€ ํด๋ž˜์Šค ์†์„ฑ์„ ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋œ ํ›„ ์ธ์Šคํ„ด์Šคํ™”๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ Backbone์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด wycats์˜ js-decorators Strawman ๋˜๋Š” ์›๋ž˜์˜ (๋Œ€์ฒด๋œ) ์กฐํ™” ํด๋ž˜์Šค ์ œ์•ˆ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค .

ํด๋ž˜์Šค ์†์„ฑ๊ณผ ํ•จ๊ป˜ getter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

์ ˆ๋Œ€์ ์ธ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ _.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;
}

๋„ค, ํ•˜์ง€๋งŒ:

๋ถˆํ–‰ํžˆ๋„ ํ•ด๋‹น ๋ฒ„์ „์€ ํด๋ž˜์Šค ์†์„ฑ์„ ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋œ ํ›„ ์ธ์Šคํ„ด์Šคํ™”๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ Backbone์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ES5๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

// 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
});

์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ›๊ธฐ ์ „์— ์š”์†Œ๊ฐ€ ์—ฌ์ „ํžˆ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด wycats์˜ js-decorators Strawman์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค...

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํด๋ž˜์Šค ์†์„ฑ๊ณผ ํ•จ๊ป˜ getter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

:+1:. ๋‚˜๋Š” ๋ชจ๋“  ์†์„ฑ์„ ๊ธฐ๋Šฅ ์œผ๋กœ

์ ˆ๋Œ€์ ์ธ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ _.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 ํด๋ž˜์Šค ์‚ฌ์–‘๊ณผ ํ•จ๊ป˜ ์ฆ‰์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € super()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜๋”๋ผ๋„ ์‹ค์ œ๋กœ Backbone ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. http://www.2ality.com/2015/02/es6-classes-final.html

@milesj : ๊ฑด์ด๋ฉฐ, ๋‹น์‹ ์€ ์ „ํ™”๋ฅผํ•ด์•ผ super() ์„ค์ •ํ•˜๊ธฐ ์ „์— this.tagName ๊ฐ™์€ ๋˜๋Š”๋ฅผ. ๊ทธ๋ฆฌ๊ณ  View์˜ ์ƒ์„ฑ์ž์—์„œ ์š”์†Œ ๋ฅผ this.tagName ์„ค์ •ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@milesj ์„œ๋ธŒํด๋ž˜์‹ฑํ•  ๋•Œ ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jridgewell ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด jeffmo์™€ sebmck์™€ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋ฐฐ๊ฒฝ ์ด์•ผ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๋ก ์€ ๊ธฐ๋ณธ ์œ ํ˜•(์˜ˆ: ๋ฐฐ์—ด) ํ™•์žฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด super() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€ this ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด DOM(๋ฐ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์œ„์น˜)์—์„œ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@jridgewell @thejameskyle ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋จผ์ € super()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์—…๋ฐ์ดํŠธ๋œ ์˜ˆ). ES6 ์ˆ˜์—…์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ทฐ ์ƒ์„ฑ์ž ๋กœ์ง์„ init() ๋ฉ”์†Œ๋“œ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ A์˜ ๋งŽ์€ ์•„์ฃผ์˜ ๋น„์šฉ์ด ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

@milesj ๋ธ”๋กœ๊ทธ ์›๋ณธ์„ ์ฝ์œผ์…จ๋‚˜์š”? super๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด ์†์„ฑ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. 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);
    }
}

๋น„ ES6๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋ฉด ์ƒ์„ฑ์ž๊ฐ€ #setup ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ View ํด๋ž˜์Šค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  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);
  }
}

๋””์Šˆ๊ฐ€๋ง:

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 ํด๋ž˜์Šค ์†์„ฑ ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

className ๊ฐ€ ์—†๋Š” ๋งŽ์€ DIV ์š”์†Œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/jashkenas/backbone/issues/3560#issuecomment -90739676, https://github.com/jashkenas/backbone/issues/3560#issuecomment -91601515 ๋ฐ https://github ์˜ ๋งˆ์ง€๋ง‰ ์ง€์ ์„ ์ฐธ์กฐํ•˜์„ธ์š” . .com/jashkenas/backbone/issues/3560#issuecomment -98827719.

์•Œ ๊ฒ ์–ด์š”. ์ด ๊ฒฝ์šฐ "๋ชจ๋“  ์†์„ฑ์„ ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌ" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ "์†์„ฑ" ๋ฉ”์„œ๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์ค„(์ƒ์„ฑ์ž๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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);
};

Toolkit์—์„œ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/titon/toolkit/issues/107

์•ˆ๋…•ํ•˜์„ธ์š”.

์—ฌ๊ธฐ์„œ ๋…ผ์˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๋ฐฑ๋ณธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด BB ์ฝ”์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ์˜๋„๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ? (๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๋ž˜์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™”๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์ฆ‰, ๋ชจ๋“  ์†์„ฑ์„ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ตœ์ข… ๋‹จ์–ด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

@gotofritz ๋ชจ๋“  ์†์„ฑ์„ ์ธ์Šคํ„ด์Šค์— ๊ฐ•์ œ ์ ์šฉํ•˜๋Š” ES6 ์†”๋ฃจ์…˜์ด ํ™•์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๋ณธ์˜ ํด๋ž˜์Šค ์‹œ์Šคํ…œ์€ ์—ฌ๊ธฐ์—์„œ ์˜ณ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ES7 ํด๋ž˜์Šค์— ์ •์  ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ ์„ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ extend ๊ณ ์ˆ˜ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”. ES6 ์ˆ˜์—…์€ ์กฐ๊ธˆ ๋” ํ•ด๋ณผ๊ป˜์š”... :-)

์ด ๋ฌธ์ œ์— ๊ฑธ๋ ค ๋„˜์–ด์ง„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์‹ค์ œ๋กœ๋Š” "๋ชจ๋“  ์†์„ฑ์„ ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌ"์ด ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ ์•ฑ์—๋Š” ์ธ์Šคํ„ด์Šคํ™” ์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋™์ (ํ˜„์ง€ํ™”๋œ) ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  route() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋‹ค์Œ์€

class Router extends Backbone.Router {

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

๋ฐฉ๊ธˆ ์ด๊ฒƒ์„ ๋ณด์•˜๊ณ  ๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ชจ๋ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” idAttribute ์†์„ฑ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Backbone์ด model.idAttribute ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ ์ƒ์„ฑ์ž๋Š” ์†์„ฑ ์ถ”๊ฐ€๋ฅผ ์˜ต์…˜์œผ๋กœ ๋ชจ๋‘ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ชจ๋‘ idAttribute ์†์„ฑ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ์žก์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” PR์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ getter ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ idAttribute (๋ฐ cidPrefix )๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

Backbone์ด model.idAttribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

get idAttribute() { return '_id'; } ๋Š” ์ผ๋ฐ˜ ์†์„ฑ์ฒ˜๋Ÿผ ์•ก์„ธ์Šค๋˜๋Š” getter ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. this.idAttribute === '_id'; .

์ด๊ฒƒ์€ ๋Œ€๋Œ€์ ์ธ ์žฌ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐฑ๋ณธ v2?

์ด๊ฒƒ์€ ๋Œ€๋Œ€์ ์ธ ์žฌ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐฑ๋ณธ v2?

์ „ํ˜€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ES6 ์„œ๋ธŒํด๋ž˜์‹ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค( Models ์ œ์™ธ). ๋ˆ„๊ตฐ๊ฐ€ @akre54 ์˜ ์ •์  ์†์„ฑ ์ œ์•ˆ์„ ํƒ์ƒ‰ํ–ˆ๋‹ค๋ฉด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์˜ ๋‘ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์—์„œ๋Š” ๊ทธ๋Ÿด ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

@jridgewell , ๋น ๋ฅธ ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์ด ์Šค๋ ˆ๋“œ(ํŠนํžˆ Yehuda Katz์˜ ์ œ์•ˆ )์—์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ œ์•ˆ๋œ ๋Œ€๋กœ ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์—ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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"
      }
})

์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ •์  ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์†Œํ’ˆ์„ ๋ชจ๋‘ ์›ํ•œ๋‹ค๋ฉด ์ „์ฒด ๋ฐฑ๋ณธ ํ™•์žฅ ๊ธฐ๋Šฅ ์„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ์ œ์•ˆ์ผ ๋ฟ์ด์ง€๋งŒ Babel์€ ์‹คํ—˜์ ์ธ ๊นƒ๋ฐœ ๋’ค์— ์ด๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๋ชจํ—˜์‹ฌ์„ ๋Š๋ผ๊ณ  ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

@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. ํด๋ž˜์Šค ์ƒ๋‹จ์— ์žˆ๋Š” props๋ฅผ ๊ฐ€์ ธ์™€ ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€ํ•˜๋Š” props ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ณด๋‹ค ํ‘œํ˜„๋ ฅ ์žˆ๊ณ  ์„ธ๋ถ„ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ˆ˜ ๋ชฉ์  ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜ ์ค‘ #3684 ์ด์™ธ์˜ ๋ฐฑ๋ณธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ํ‘œ์ค€ํ™”๋˜๋ฉด ๋ฐฑ๋ณธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฅ๋ฏธ๋กœ์šด ์—ญํ• ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์›”์š”์ผ/ํ™”์š”์ผ์— ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

@benmccormick ์ˆ˜์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ ์€ ์ž ์‹œ ํ›„์— ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ: ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :) ๊ฒŒ์‹œํ•  ๋•Œ ํŠธ์œ„ํ„ฐ์— ping์„ ๋ณด๋‚ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? :+1:

์šฐ๋ฆฌ๋Š” ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์•„๋‹Œ ๋งˆ๋ฆฌ์˜ค๋„คํŠธ์˜ modelEvents ๋ฐ collectionEvents ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ํด๋ž˜์Šค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(์˜ˆ: ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์˜ tagName ๋ฐ ํ…œํ”Œ๋ฆฟ)๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ €๋Š” ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์  ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฐฑ๋ณธ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์•„์ง 0๋‹จ๊ณ„๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ Backbone ์•ฑ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹, ํŠนํžˆ ์ด๋ฒคํŠธ ํ•ด์‹œ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ์–ด ํ›Œ๋ฅญํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฐ€ ๊ฟ€๊ฟ€๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์ข…์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

@StevenLangbroek ์ •์  ์†์„ฑ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ์ง€์ •๋œ ๊ตฌ๋ฌธ์€ ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ๊ฐ ์ธ์Šคํ„ด์Šค์— ๋กœ์ปฌ ์†์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ์Šˆํผ ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋œ ํ›„์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

@benmccormick , ๊ฒŒ์‹œ๋ฌผ์ด ์ข‹์•„ ๋ณด์ด๊ณ  ๊ฐ ์˜ต์…˜์˜ ์žฅ๋‹จ์ ์„ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์ €๋Š” ํŠน์ˆ˜ ๋ชฉ์  ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ •๋ง ์ข‹์•„ํ•˜๋ฉฐ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์‚ฌ์–‘์— ํฌํ•จ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@benmccormick ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์ด ์•„๋‹Œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ _#extend ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ _#result ๋Œ€์‹  @akre54 ์˜ _.instOrStaticVar ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ IMHO๊ฐ€ ๋” ๊นจ๋—ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. @akre54๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์†์„ฑ์€ ํ”„๋กœํ† ํƒ€์ž… ๊ณต์œ  ๋ฌธ์ž์—ด๊ณผ ๊ฐ์ฒด (์ฆ‰, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ๊ณต์œ ๋จ)์ด๋ฏ€๋กœ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

๋‚˜๋Š” ๋” ๋‚˜์•„๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์—… ํด๋ž˜์Šค ์†์„ฑ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์†์„ฑ์—๋„ ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์žฅ์‹๋œ ์†์„ฑ์„ ํ”„๋กœํ† ํƒ€์ž…์— ์ฒจ๋ถ€ํ•˜๋Š” ํŠน์ˆ˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์˜ˆ์ œ์™€ ํ•จ๊ป˜ Babel REPL ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์‹คํ—˜์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ธ”๋กœ๊ทธ ๋Œ“๊ธ€์—์„œ ๋…ผ์˜๋œ @just-boris, ์—ฌ๊ธฐ์—์„œ ๋ณด๊ณ  ์žˆ๋Š” ๋™์ž‘์€ Babel์˜ ํด๋ž˜์Šค ์†์„ฑ ๋ฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์–‘ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์–ด๋–ค ์ œ์•ˆ์—์„œ๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ผ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ ๋ฐ/๋˜๋Š” ์—ฌ๊ธฐ ์—์„œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ํด๋ž˜์Šค ์†์„ฑ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋™์ž‘์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹น์‹ ์ด ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ด ์–ธ์ œ๋ผ๋„ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@benmccormick wycats/javascript-decorators ์—๋Š” ์ด๋ฏธ ์†์„ฑ ์ด๋‹ˆ์…œ๋ผ์ด์ €์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค .

์—ฌ๊ธฐ์„œ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์†์„ฑ ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์„ค๋ช…์ž์ด์ž ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋„ ์ด๋ฅผ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฑฑ์ •ํ•  ์ด์œ ๋Š” ์—†์ง€๋งŒ ํ•ด๋‹น ์„น์…˜์˜ ์‚ฌ์–‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„ ์ •๋ง ๋ฉ‹์ง€๋‹ค, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ์ง€์ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 21์ผ ์›”์š”์ผ ์˜ค์ „ 11์‹œ 29๋ถ„, Boris Serdiuk [email protected]
์ผ๋‹ค:

@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์ด ์ œ์•ˆํ•œ ๋ฐฉ๋ฒ• ๊ธฐ์ˆ  ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์žฅ๋‹จ์ ์„ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

Btw, ํ›Œ๋ฅญํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด @benmccormick ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์— properties ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒจ๋ถ€ํ•˜๋Š” ์ œ์•ˆ(#121) pull-request ์™ธ์—๋„ https://github.com/dsheiko/backbone-abstract/tree/master/demo-es6/src/Js
@akre54๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Justin์€ ์ด๋ฏธ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜( preInitialize ๋ฐฉ๋ฒ•)์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‚ด ์ง€์ ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ์  ํด๋ž˜์Šค ์†์„ฑ์„ ๊ธˆ์ง€ํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  TypeScript์—์„œ๋„ ์œ ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

PS preInitialize ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋“ค๋ฆฌ๋ฏ€๋กœ ์ด ๋งฅ๋ฝ์—์„œ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ƒ์„ฑ์ž์˜ ์ž‘์—…๋ณด๋‹ค ๋จผ์ € ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด preConstruct ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž…์— ์„ค์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ์†์„ฑ ์ œ์•ˆ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ œ์•ˆ์— ๊ด€๋ จ๋œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ ์˜๋ฏธ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ jeffmo์˜ ์ œ์•ˆ์€ ์ƒ์„ฑ์ž์— ๋„ฃ๋Š” ๋ฐ˜๋ฉด ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž…์— ์†์„ฑ์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  React/Backbone ์ฝ”๋“œ๋ฅผ ES2015 ํด๋ž˜์Šค๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ @benmccormick !! ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ํ•ด๋‹น ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@benmccormick , ๊ธฐ๋ณธ ์†์„ฑ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ดํŽด๋ณด์„ธ์š”: https://github.com/epicmiller/es2015-default-class-properties

๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์ž˜ ๋ณ€ํ™˜๋˜๋ฉฐ ์ƒ์„ฑ์ž์—์„œ ๋˜๋Š” ์„ ์–ธ ํ›„์— ์ •์˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํด๋ž˜์Šค ์†์„ฑ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ES2016/ES2017์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”ฐ๋ผ ๋‚ด๋ ค์˜ด์— ๋”ฐ๋ผ ์ด๊ฒƒ์€ ๋ฐฑ๋ณธ์— ๋Œ€ํ•œ ์žฅ๊ธฐ ์†”๋ฃจ์…˜๋ณด๋‹ค ํ•™๋ฌธ์  ์—ฐ์Šต์— ๋” ๊ฐ€๊น์ง€๋งŒ 2-3๋…„์ด ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ์ด์™€ ๊ฐ™์€ ๊ฒƒ์€ ํ™•์‹คํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋‹ค.

๊ธ€์Ž„, ๋ฌธ์ œ๋Š” ํด๋ž˜์Šค ์†์„ฑ์ด Ecmascript ์ œ์•ˆ ๋‹จ๊ณ„ ์‹œ์Šคํ…œ์—์„œ ์—ฌ์ „ํžˆ 1๋‹จ๊ณ„์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "์‚ฌ์šฉ์ž๊ฐ€ ์–ป๋Š” ๊ฒƒ"์ด๋ผ๋Š” ์ธก๋ฉด์—์„œ ๊น€๋ฏธ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ตฌ๋ฌธ์ ์œผ๋กœ๋‚˜ ์ฐธ์กฐ ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ ์ฝ์œผ๋ฉด์„œ https://github.com/epicmiller/es2015-default-class-properties ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•  ๋•Œ Backbone์— ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

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

์œ„์˜ ์ฝ”๋“œ๋Š” MyModel.prototype.idAttribute๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. TypeScript์˜ ๊ฒฝ์šฐ ์„ ์–ธ ํŒŒ์ผ์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜์—ฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Š” ES6 ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ์ด ์—†๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค...

@t-beckmann์€ ์•„์ฃผ ์ข‹์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜„์žฌ 2๋…„ ๋™์•ˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Backbone ๋ฐ ES6 ํด๋ž˜์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์—ฌ์ „ํžˆ ์ตœ๊ณ ์˜(์œ ์ผํ•œ) ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋œ ํด๋ž˜์Šค ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž ์žฌ์ ์ธ ์†”๋ฃจ์…˜์„ ๊ณต์œ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. .

์ด์ œ ํด๋ž˜์Šค ์†์„ฑ์ด 2๋‹จ๊ณ„ ์— ์žˆ๊ณ  babel ์‚ฌ์ „ ์„ค์ •๊ณผ ํ•จ๊ป˜ ๋„๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ธ์Šคํ„ด์Šค/๋ฉค๋ฒ„ ์†์„ฑ์˜ ๋ฌธ์ œ๋Š” _after_ constructor() ๋•Œ๊นŒ์ง€ ํ”„๋กœํ† ํƒ€์ž…์— ์ ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์†์„ฑ์ด ์ƒ์„ฑ์ž ๋‚ด์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •์  ์†์„ฑ์€ ์ฆ‰์‹œ ์ ์šฉ๋˜์ง€๋งŒ (์„ค๊ณ„์ƒ) ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ๋ณต์‚ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ shim์€ ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑ์ž์˜ ์ •์  ์†์„ฑ์„ ์ธ์Šคํ„ด์Šค๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค(ํšจ๊ณผ์ ์œผ๋กœ ์ƒˆ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ  ์†์„ฑ์„ ์ ์šฉํ•œ ๋‹ค์Œ ์›๋ž˜ ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰). ํ™•์‹คํžˆ ํ•ดํ‚น์ด์ง€๋งŒ ๊ฒฐ๊ณผ์— ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์‹ฌ:

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}"
    }
}

๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜๊ฑฐ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋†“๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์˜ค๋ž˜๋œ ๋ฌธ์ œ๋ฅผ ๋ถ€ํ™œ์‹œ์ผœ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

Backbone.*.extend({...})๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ES6 ํด๋ž˜์Šค ์„ ์–ธ์„ ๋ณ€ํ™˜ํ•˜๋Š” babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@enzious๋Š” ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค :)

@t-beckmann์˜ ์†”๋ฃจ์…˜ ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จ

๋‚˜์—๊ฒŒ๋Š” ์ œ๋Œ€๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. idAttribute๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•˜์ง€ ์•Š์„๊นŒ์š”?

๋˜ํ•œ Promise ์ง€์›์ด ์žˆ์œผ๋ฉด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ jquery Deferred๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋„ค์ดํ‹ฐ๋ธŒ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ Backbone ๋‚ด์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋„๊ตฌ ๋ฐ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ๊ฑฐ์‹œ ๋ฐฑ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒˆ๋กœ ๊ณ ์น˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. Symbol.iterator๊ฐ€ ๊ตฌํ˜„๋˜๊ณ  ํ”„๋กœ๋•์…˜ ๋ฆด๋ฆฌ์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ํŠนํžˆ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋” ๋ช…ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ฐพ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ €๋Š” TypeScript๋ฅผ ๋ฐฑ๋ณธ ์•ฑ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด ๋Œ“๊ธ€ ์˜ ์†”๋ฃจ์…˜ ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋” ๋‚˜์€ ์ถ”๋ก ์„ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์†์„ฑ์— ๋ช…์‹œ์ ์œผ๋กœ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์˜ˆ์ œ๋Š” ParentExample {์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
// ์—ฌ๊ธฐ์— ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ ๋“ฑ
}

x.์˜ˆ์‹œ = ์˜ˆ;

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

@kamsci ์ €๋Š” Backbone์„ ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•œ ์ด ๋ถ„๊ธฐ ์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ๋ณธ์€ ๊ตฌ์„ฑ ๊ฐœ์ฒด๊ฐ€ _์„ ์–ธ์ _์ธ ์ง€์ ๊นŒ์ง€ _๊ตฌ์„ฑ_์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ƒ์†๊ณผ ํ•จ๊ป˜ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํด๋ž˜์Šค๋ฅผ ๋ณต์ œํ•˜๊ณ  ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค. ์ƒ์†์ด ์•„๋‹™๋‹ˆ๋‹ค.)

๋ฐฑ๋ณธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ES5 ์ฝ”๋“œ๋ฅผ ์ž˜๋ผ๋‚ด์–ด ๋ถ™์—ฌ๋„ฃ์€ ๋‹ค์Œ ES6์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌด์—‡?

๊ตฌ์„ฑ ๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ์„ฑ์˜ ๋‚ด์šฉ์„ ๋…ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ/์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์šธ์ง€ ๋ง๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์–ด๋ฆฌ์„์€ ์ง“์ด์•ผ. ํ•˜์ง€๋งŒ, ํŒจํ„ด์˜

Foo = BackboneThing.extend({LONG DECLARATIVE OBJECT LITERAL}) ์—ญ์‹œ ์–ด๋จธ๋‹ˆ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ถ”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ถ”ํ•œ์ง€ ๋ชจ๋ฅผ ์ •๋„๋กœ ์˜ค๋žซ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ €๋Š” ํฐ ๋งˆ๋ฆฌ์˜ค๋„คํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๊ณ  ES6 ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. Backbone ํ™•์žฅ ์„ ์–ธ์„ ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” jscodeshift ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋‹จ์ˆœํ™” ๊ฐ€์ •์„ ๋งŒ๋“ค์ง€๋งŒ ์‹œ์ž‘์ ์œผ๋กœ๋งŒ ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ @t-beckmann์ด ์ œ์•ˆํ•œ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
https://gist.github.com/maparent/83dfd65a37aaaabc4072b30b67d5a05d

์ด ์Šค๋ ˆ๋“œ์— ์ด์ƒํ•œ ์ž˜๋ชป๋œ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ES6์— ๋Œ€ํ•œ '์ •์  ์†์„ฑ'์€ ์ธ์Šคํ„ด์Šคํ™” ์—†์ด ํด๋ž˜์Šค์— ์กด์žฌํ•˜๋Š” ์ƒ์„ฑ์ž์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค(์˜ˆ: Class.extend). ์ด ์Šค๋ ˆ๋“œ์—์„œ '์ •์  ์†์„ฑ'์€ '์ •์ ' ๊ฐ’(๊ฒŒํ„ฐ ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹˜)์ด ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž…์˜ ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งž์•˜์–ด?

์ •์  ๊ฐ’์ด ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์˜ ๊ฒฝ์šฐ Backbone ์‚ฌ์ „ ์ดˆ๊ธฐํ™” ๊ฐ’์„ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ „ํ™˜์ด๋ฉฐ _.result๊ฐ€ ๊ธฐ๋ณธ๊ฐ’, className, id ๋“ฑ์— ๋Œ€ํ•ด ์˜ˆ์ƒ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ์†์„ฑ์€ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์˜ ์ƒ๋‹จ์€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ES6 ํด๋ž˜์Šค์—์„œ ํ˜„์žฌ ์ •์  ๊ฐ’์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์—†๊ณ  getter, setter ๋ฐ ํ•จ์ˆ˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ์ƒ์„ฑ์ž/ํด๋ž˜์Šค ์ •์  ์†์„ฑ(Class.extend)์€ ES6์—์„œ์ฒ˜๋Ÿผ ๋ฐฑ๋ณธ์—์„œ ์ƒ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฑ๋ณธ์€ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋Ÿฌํ•œ ์†์„ฑ์ด ES6์ฒ˜๋Ÿผ ์ƒ์†๋˜๋„๋ก ํ•˜๋Š” ๋Œ€์‹  ํด๋ž˜์Šค ์ •์  ์†์„ฑ์„ ์ƒˆ ํด๋ž˜์Šค/์ƒ์„ฑ์ž์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://github.com/jashkenas/backbone/pull/4235 ์—์„œ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ™๋ณด๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ/ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฝค ๋งŽ์ด ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐฑ๋ณธ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ ์ƒˆ ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ๋‚˜์ค‘์— Class.extend๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰