Skip to content

ecmascript_4_1

Kyusung edited this page Oct 20, 2017 · 2 revisions

์˜คํผ๋ ˆ์ด์…˜

Object์— ๊ฐ™์€ key ์‚ฌ์šฉ

  • ES5: strict ๋ชจ๋“œ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
  • ES6: strict ๋ชจ๋“œ์™€ ๊ด€๊ณ„์—†์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋‚˜์ค‘์— ์ž‘์„ฑ๋œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋จ
let sameKey = { one: 1, one: 2};
console.log(sameKey); // Object {one: 2}

๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๊ฐ’ ์„ค์ •

let one = 1, two = 2;
let values = { one, two };
console.log(values); // Object {one: 1, two: 2}

Object์— function ์ž‘์„ฑ

// ES5
var obj = {
  getTotal: function(param) {
    return param;
  }
}

// ES6
let obj = {
  getTotal() {
    return param;
  }
}

๋””์Šคํฌ๋ฆฝํ„ฐ

ES5์— Object ํด๋ž˜์Šค์—๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
Data ํƒ€์ž…

  • value: ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
  • get: ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
  • set: ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ Access ํƒ€์ž…
  • enumerable: ํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์„ค์ •
  • configurable: ํ”„๋กœํผํ‹ฐ์˜ ์‚ญ์ œ ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์„ค์ •
  • writable: ํ”„๋กœํผํ‹ฐ์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์„ค์ •
var obj = {};
// ์ด ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ์ฒด์˜ Property๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜ property descriptor๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 
// ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์•ก์„ธ์Šค ํƒ€์ž…์˜ ์†์„ฑ์„ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
Object.defineProperty( obj, "value", {
  value: true,
  writable: false,
  enumerable: true,
  configurable: true
});

(function(){
  var name = "John";

  Object.defineProperty( obj, "name", {
    get: function(){ return name; },
    set: function(value){ name = value; }
  });
})();

console.log( obj.value ); // true
console.log( obj.name ); // John

obj.name = "Ted";

console.log( obj.name ); // Ted

for ( var prop in obj ) {
  console.log( prop ); // value, name
}

obj.value = false; // Exception if in strict mode

Object.defineProperty( obj, "value", {
  writable: true,
  configurable: false
});

obj.value = false;
console.log( obj.value ); // false
delete obj.value; // Exception

getter, setter

ES5์˜ getter์™€ setter๋Š” access descriptor๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ œํ•œ์ ์ธ ์ ‘๊ทผ์ด๋‹ค.
๋”ฐ๋ผ์„œ ES6์—์„œ๋Š” ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ getter์™€ setter๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ES5 getter
var obj = {};
Object.defineProperty(obj, "book", {
  get: function(){
    return "์ฑ…";
  }
});
console.log(obj.book) // ์ฑ…

// ES5 setter
var obj = {};
Object.defineProperty(obj, "item", {
  set: function(param){
    this.sports = param;
  }
});
obj.item = "์•ผ๊ตฌ"
console.log(obj.sports); // ์•ผ๊ตฌ
// ES6 getter
let obj = {
  value: 123,
  get getValue(){
    return this.value;
  }
};
console.log(obj.getValue);

// ES6 setter
let obj = {
  set setValue(value){
    this.value = value;
  }
};
obj.setValue = 123;
console.log(obj.value);
  • ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ๋งˆ๋‹ค Validation์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • lazy loading์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • read์™€ write ๊ถŒํ•œ์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด getter๋Š” pubic, setter๋Š” private
  • ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, getter์™€ setter๋ฅผ overridingํ•ด์„œ ํด๋ž˜์Šค๋งˆ๋‹ค validation ๋“ฑ์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

getter, setter๋Š” ์ •๋ง ํ•„์š”ํ•œ ๊ฑธ๊นŒ?

is(): ๊ฐ’๊ณผ ๊ฐ’ ํƒ€์ž… ๋น„๊ต

๋‘ ๊ฐ’๊ณผ ๊ฐ’ ํƒ€์ž…์„ ๋น„๊ตํ•œ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

Object.is(1, "1")); // false;

assign(): ์˜ค๋ธŒ์ ํŠธ ํ”„๋กœํผํ‹ฐ ๋ณต์‚ฌ

๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ค๋ธŒ์ ํŠธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ค๋ธŒ์ ํŠธ ๋์— ๋ณต์‚ฌํ•˜๊ณ , ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

// ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๊ฐ’์ด ์—ฐ๋™๋œ๋‹ค.
let sports = {
  event: "์ถ•๊ตฌ",
  palyer: 11
}
let dup = sports;

sports.player = 55;
console.log(dup.player); // 55

dup.event = "๋†๊ตฌ";
console.log(sports.event); // ๋†๊ตฌ

// assign์„ ์ด์šฉํ•ด ์—ฐ๋™๋˜์ง€ ์•Š๊ณ  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.
let sports = {
  event: "์ถ•๊ตฌ",
  palyer: 11
}
let dup = Object.assign({}, sports);
console.log(dup.player); // 11

dup.player = 33;
console.log(sport.player); // 11

sports.event = "์ˆ˜์˜"
console.log(dup.event) // ์ถ•๊ตฌ

assign() ๊ณ ๋ ค์‚ฌํ•ญ

Object.assign() ๋ณต์‚ฌํ•œ ๊ฐ’์ด ์—ฐ๋™๋˜์ง€ ์•Š์ง€๋งŒ, ๋ฐ˜ํ™˜๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๋Š” ์—ฐ๋™๋œ๋‹ค.

let oneObj = {one: 1}, twoObj = {two: 2};
let mergeObj = Object.assign(oneObj, twoObj);

console.log(Object.is(oneObj, mergeObj)); // true

mergeObj.one = 456;
console.log(Object.is(oneObj, mergeObj)); // true
// ๋‹ค์ˆ˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
let obj = {one: 1};
Object.assign(obj, {two: 2}, {two: 3}, {four: 4});
for (var pty in obj){
  console.log(pty, obj[pty]);
}

// one 1  two 3  four 4

assign() getter

์˜ค๋ธŒ์ ํŠธ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ• ๋•Œ ํ”„๋กœํผํ‹ฐ๊ฐ€ getter์ด๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค.

let count = {
  current: 1,
  get getCount() {
    return ++this.current;
  }
};

let mergeObj = {}
Object.assign(mergeObj, count);
console.log(mergeObj); // Object { current: 1, getCount: 2}

setPrototypeOf(): __proto__์— ์ฒจ๋ถ€

์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•˜๊ณ , ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ prototype์„ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น prototype์— ์—ฐ๊ฒฐ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ ์˜ค๋ธŒ์ ํŠธ์˜ __proto__์— ์ฒจ๋ถ€ํ•œ๋‹ค. (๊ณต์œ )

let Sports = function(){};
Sports.prototype.getCount = function(){
  return 123;
}
let protoObj = Object.setPrototypeOf({}, Sports.prototype);
console.log(protoObj.getCount()) // 123

Clone this wiki locally