Skip to content

javascript_in_depth_4

kyusung edited this page Apr 19, 2017 · 1 revision

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์ƒ์†์˜ ํ™œ์šฉ

์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

Object.create ํ•จ์ˆ˜

๊ธฐ์กด์— ์ƒ์† ๋ฐฉ์‹์˜ ๊ตฌ์กฐ์ ์ธ ๋ถˆ์™„์ „์„ฑ ์ด์™ธ์—๋„ new ํ‚ค์›Œ๋“œ ์ž์ฒด๊ฐ€ "์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‹ต์ง€ ์•Š๋‹ค"๋Š” ์˜๊ฒฌ์ด ๋งŽ์ด ๋ฐ˜์˜๋˜๋ฉด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
๋จผ์ € ๋”๊ธ€๋ผ์Šค ํฌ๋ฝํฌ๋“œ๊ฐ€ ์ฃผ์žฅํ–ˆ๋˜ Object.create ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
}

Object.create์˜ ๋‚ด๋ถ€์ ์ธ ํ˜•ํƒœ๋Š” ๊ธฐ๋ณธ ํ•จ์ˆ˜ F๋ฅผ ์„ ์–ธํ•˜๊ณ  F์˜ ํ”„๋กœํ† ํƒ€์ž…๋งŒ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฐ์ฒด๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์ƒˆ๋กœ์šด F ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ Object.create ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” ์ƒ์„ฑ์ž์ธ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•  ๊ฐ์ฒด ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ผ๋Š” ์ ์ด๋‹ค.

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

Object.create ํ•จ์ˆ˜์˜ ์ƒ์† ์—ฌ๋ถ€ ํ™•์ธ

var person = {
  yell: function() {
    console.log("My name is " + this.name);
  }
};

var unikys = Object.create(person);
unikys.name = "Unikys";
unikys.yell();

// Object.create ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ์ƒ์† ํ™•์ธ์ด ์–ด๋ ค์šด ์˜ˆ
//console.log(unikys instanceof person); // TypeError!

// Object.create ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ํ™•์ธ
console.log(Object.getPrototypeOf(unikys) === person); // true
console.log(Object.getPrototypeOf(person)); // Object {}

// Object.create ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ์šฐ์˜ ์ƒ์† ํ™•์ธ
console.log(person.isPrototypeOf(unikys)); // true
console.log(Object.prototype.isPrototypeOf(unikys)); // true

Object.create์˜ ๊ฐ์ฒด ์ดˆ๊ธฐํ™”

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์•ˆ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Object.create ํ•จ์ˆ˜์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋ฉด Object.create์™€ ๋ณ„๋„๋กœ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๋ฌถ์–ด์„œ ๊ฐ์ฒด๋ณ„๋กœ ๊ฐ„๋‹จํ•œ ์ƒ์† ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ‘œ์ค€์˜ Object.create ํ•จ์ˆ˜์˜ 2๋ฒˆ์งธ ์ธ์ž๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋ฐ›์•„์„œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

// Object.create ํ•จ์ˆ˜๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์†์„ฑ ์ดˆ๊ธฐํ™” ์˜ˆ

var unikys = Object.create(Person.prototype, {
    name : {
        value: "Unikys",
        configurable: true,
        enumerable: true,
        writable: true
    }
});

Object.defineProperty

Object.create์™€ new ํ‚ค์›Œ๋“œ ์กฐํ•ฉ

function Person() {
  this.name = "anonymous";
}
function Unikys() {
  this.name = "Unikys";
}

Unikys.prototype = Object.create(Person.prototype, {
  constructor: {
    value: Unikys
  }
});

var unikys = new Unikys();
console.log(unikys instanceof Unikys); // true
console.log(unikys instanceof Person); // true
console.log(unikys.constructor); // function Unikys()

์ด๋ ‡๊ฒŒ Object.create์˜ 2๋ฒˆ์งธ ์ธ์ž๋กœ Unikys.prototype์˜ ์ƒ์„ฑ์ž ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ธฐ์กด์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋˜, ์ƒ์„ฑ์ž์˜ ์—ฐ๊ฒฐ์ด ๊นจ์ง€๋˜ ํ˜„์ƒ์„ ๋ณด์™„ํ•˜์—ฌ new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ์ƒ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

class์™€ extends๋ฅผ ํ†ตํ•œ ์ƒ์†

ECMAScript 6์—์„œ๋Š” ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ์ธ class์™€ extends๋ฅผ ์ •์˜ํ•˜์˜€๋‹ค. ๊ธฐ์กด์˜ new ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์˜ค๋™์ž‘์€ ์ผ์–ด๋‚˜๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์„œ ์˜ค๋™์ž‘์˜ ์›์ธ์„ ์ฐพ์•„๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฒ˜๋Ÿผ new ํ‚ค์›Œ๋“œ์˜ ์ƒ์„ฑ์ž์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ๋ณด์™„ํ•˜์˜€๋‹ค.

class Person {
  constructor() {
    this.name = "anonymous";
  }
}
class Unikys extends Person {
  constructor() {
    super();
    this.name = "Unikys";
  }
}

var unikys = new Unikys();
console.log(unikys instanceof Unikys); // true
console.log(unikys instanceof Person); // true
console.log(unikys.constructor); // class Unikys extend Person

ES6 Class๋Š” ๋‹จ์ง€ prototype ์ƒ์†์˜ ๋ฌธ๋ฒ•์„คํƒ•์ผ ๋ฟ์ธ๊ฐ€?

Object.create ํ•จ์ˆ˜ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๋ณด์™„

// ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์„ ์œ„ํ•œ Object.create ํ•จ์ˆ˜ ์ •์˜
(function () {
    if (!Object.create) {
        Object.create = (function() {
            function F() {}
            return function (o) {
                F.prototype = o;
                return new F();
            }
        }());
    }
}());

Clone this wiki locally