Skip to content

inside_javascript_2

kyusung edited this page Apr 13, 2017 · 1 revision

์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๋ถ€๋ชจ์ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ๋งํฌ ํ˜•ํƒœ์˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
ECMAScript์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋งํฌ๋ฅผ ์•”๋ฌต์  ํ”„๋กœํ† ํƒ€์ž… ๋งํฌ(implicit prototype link) ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์ด๋Ÿฌํ•œ ๋งํฌ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ [[Prototype]] ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์„ฑ ๊ทœ์น™์€ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ž์‹ ์˜ ๋ถ€๋ชจ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๋Š” [[Prototype]] ํ”„๋กœํผํ‹ฐ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. ([[Prototype]] ๋งํฌ)

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์ด๋ž€ ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋–„, ํ•ด๋‹น ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋ ค๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด [[Prototype]] ๋งํฌ๋ฅผ ๋”ฐ๋ผ ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ž์‹ ์˜ ๋ถ€๋ชจ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์—์„œ์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” Object()๋ผ๋Š” ๋‚ด์žฅ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ๋‹ค.

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.

    function Person(name, age, hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }
    
    var foo = new Person('foo', 30, 'tennis');
    
    // ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹ (foo > Person.prototype > Object.prototype.hasOwnProperty)
    console.dir(foo.hasOwnProperty('name')); // ture
    console.dir(Person.prototype);

    foo์˜ ๊ฐ์ฒด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” Person์ด๋‹ค.
    foo ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.
    ์ฆ‰, foo ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” Person.prototype์ด ๋œ๋‹ค.

    ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์ด๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์ด๋‚˜ ๊ฒฐ๊ตญ์—” Object.prototype์—์„œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์ด ๋๋‚œ๋‹ค.

  • ํ”„๋กœํ† ํƒ€์ž…๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž์‹ ์˜ prototype ํ”„๋กœํผํ‹ฐ์— ์—ฐ๊ฒฐ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ๋””ํดํŠธ๋กœ constructor ํ”„๋กœํผํ‹ฐ๋งŒ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋‹ค.
    ๋”ฐ๋ผ์„œ, ์ผ๋ฐ˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ๋œ ํ”„๋กœํผํ‹ฐ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์— ๋ฐ˜์˜๋œ๋‹ค.

    function Person(name) {
        this.name = name;
    }
    
    var foo = new Person('foo');
    // foo.sayHello() // Error!
    
    Person.prototype.sayHello = function() { console.log('Hello'); }
    foo.sayHello(); // Hello
  • ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ์™€ this ๋ฐ”์ธ๋”ฉ
    ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” _๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ this ๋ฐ”์ธ๋”ฉ ๊ทœ์น™_์ด ์ ์šฉ๋œ๋‹ค.

    function Person(name) {
        this.name = name;
    }
    
    // getName() ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    Person.prototype.getName = function () { return this.name; };
    
    var foo = new Person('foo');
    console.log(foo.getName()); // foo
    
    // Person.prototype ๊ฐ์ฒด์— name ํ”„๋กœํผํ‹ฐ ๋™์  ์ถ”๊ฐ€
    Person.prototype.name = 'person';
    console.log(Person.prototype.getName()); // person
  • ๋””ํดํŠธ ํ”„๋กœํ† ํƒ€์ž… ๋ณ€๊ฒฝ
    ๋””ํดํŠธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ™์ด ์ƒ์„ฑ๋˜๋ฉฐ, ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ์— ์—ฐ๊ฒฐ๋œ๋‹ค.
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๋””ํดํŠธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์ผ๋ฐ˜ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ด ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ์†์„ ๊ตฌํ˜„ํ•œ๋‹ค.

    ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ๋ณ€๊ฒฝ๋œ ์‹œ์  ์ดํ›„์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค๋งŒ [[Prototype]] ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

    function Person(name) {
        this.name = name;
    }
    console.log(Person.prototype.constructor); // Person(name)
    
    var foo = new Person('foo');
    console.log(foo.country); // undefined
    
    // ๋””ํดํŠธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋ณ€๊ฒฝ
    Person.prototype = { country: 'Korea' };
    console.log(Person.prototype.constructor); // Object()
    
    var bar = new Person('bar');
    console.log(foo.country); // undefined
    console.log(bar.country); // Korea
    console.log(foo.constructor); // Person(name)
    console.log(bar.constructor); // Object()
  • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์˜ ์ฝ๊ธฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งŒ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹ ๋™์ž‘ํ•œ๋‹ค.

    function Person(name) { 
        this.name = name;
    }
    
    Person.prototype.country = 'Korea';
    
    var foo = new Person('foo');
    var bar = new Person('bar');
    
    console.log(foo.country); // Korea
    console.log(bar.country); // Korea
    
    // foo ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€
    foo.country = 'USA'; 
    
    console.log(foo.country); // USA
    console.log(bar.country); // Korea

Clone this wiki locally