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 ํ์ฅ ๊ตฌ๋ฌธ๊ณผ ๊ด๋ จํ์ฌ ๋ช ํํ ํํ์ ํฌํจํ๋ฏ๋ก ๋ ๋์ ์๋ฃจ์ ์ด ๊ฐ๋ฐ๋ ์ ์๋ค๋ฉด ํ๋ฅญํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์์ ํ ํ์ ํ ์๋ ์์ง๋ง ๋ด ๋ธ๋ก๊ทธ์ ๊ธ์ ์ฐ๋ ๋์ ๋ง์์ ๋ ์ค๋ฅธ ์์ด๋์ด ์ค ํ๋๋ ์์ฑ ํด์๋ฅผ ์ถ๋ ฅํ๋ "์์ฑ" ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ฑ์๋ ํด๋น ํจ์๋ฅผ ์คํํ๊ณ ์์ฑ์๊ฐ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ ์ ์ธ์คํด์ค์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์, ์ด๊ฒ์ ํ์คํ ์คํจ์ ๋๋ค. ๋ค๋ฆฌ ์์ ์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด์ผ๊ธฐ์ ๊ตํ์ ์ต์ํ ์ ์ ์์ฑ ์ง์์ด ์ด๋ฃจ์ด์ง ๋๊น์ง Backbone๊ณผ ํจ๊ป ES6 ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋น์ ์ด ์ ์ํ ๋์ฒด ์ต์ ์ค ๋ด๊ฐ ์ ํธํ๋ ์๋ฃจ์ ์ ๋ฌธ์์ด/๊ฐ์ฒด๋ฅผ ๋ฐํ ๊ฐ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ๋๋ค. Backbone API ๋์์ธ์ ํต์ฌ ๋ถ๋ถ์ ์ด๋ฌํ ํ๋กํ ํ์ ๊ณต์ ๋ฌธ์์ด๊ณผ ๊ฐ์ฒด์ ์์ผ๋ฉฐ ๊ฐ๋ฐ์๊ฐ ์์ฑ์์ ์ธ์คํด์ค์ ๊ฐ ์์ฑ์ ํ ๋นํ๋๋ก ์๊ตฌํ๋ฉด API๊ฐ ๋๋ฌ์์ง๋๋ค(๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ๋งํ ๊ฒ๋ ์๊ณ ).
์ผ๊ด์ฑ ์ธ์๋ extend
Backbone๊ณผ ํจ๊ป class ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๊ฐ ์์ต๋๊น?
ํ๋ฅญํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋๋ค. ES6๊ณผ Backbone ํด๋์ค๊ฐ ํจ๊ป ํ๋ ์ดํ๋ ๋ฐฉ์์ด ๊ถ๊ธํฉ๋๋ค. ๋น์ ์ ์๋ฃจ์ ์ ๊ดํด์:
์ด์ผ๊ธฐ์ ๊ตํ์ ์ต์ํ ์ ์ ์์ฑ ์ง์์ด ์ด๋ฃจ์ด์ง ๋๊น์ง 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()
๋ฉ์๋๋ก ์ฎ๊ธฐ๋ฉด ๋ฉ๋๋ค.
@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๊ฐ ํ์ํฉ๋๋ค):
๋๋ ์ฌ์ ํ ์ด ๋ชจ๋ ๊ฒ์ด ํํ๋ ฅ์ ์ด๋ ์ ๋ ์ ํํ๋ ๊ฒ์ผ๋ก ๋ด ๋๋ค. ํ์ง๋ง ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ณต์ ์ฌ์์ด ๋๋ค๋ฉด ๋ฌธ์ ๋ ์ด๋ ์ ๋ ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ์๋ 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> {}
๋ช ์์ ์์ฑ ์ฃผ์์ ์:
@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๋ฅผ ์์ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ์ฝ์ผ๋ฉด์ https://github.com/epicmiller/es2015-default-class-properties ์ข์ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ์์ต๋๋ค. ์๋ํ ๋ Backbone์ ์ด์ ๋ํ ์ง์์ด ๋ด์ฅ๋์ด ์์์ ๊นจ๋ฌ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
์์ ์ฝ๋๋ MyModel.prototype.idAttribute๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํฉ๋๋ค. TypeScript์ ๊ฒฝ์ฐ ์ ์ธ ํ์ผ์ ์ฝ๊ฐ ์กฐ์ ํ์ฌ ์์ฑ์ ํจ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํด์ผ ํ์ง๋ง ์ด๋ ES6 ์ฌ์ฉ์์ ๊ด๋ จ์ด ์๋ ์ธ๋ถ ์ฌํญ์ ๋๋ค...