Skip to content

javascript_jquery_basic_3_3a

KyusungDev edited this page Apr 28, 2017 · 33 revisions

ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ๊ณต์œ ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

ํ‚ค์›Œ๋“œ

  • Prototype
  • __proto__ == [[prototype]]
  • Constructor

ECMAScript ๊ทœ๊ฒฉ ๋‚ด์šฉ

  1. ๋ชจ๋“  ๊ฐ์ฒด๋Š” __proto__ ๊ฐ์ฒด๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š”๋‹ค. (๋‚ด๋ถ€ ์ฐธ์กฐ์šฉ์œผ๋กœ ์‚ฌ์šฉ)
  2. ์ƒ์„ฑ์ž(๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜)๋Š” prototype ๊ฐ์ฒด๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š”๋‹ค.
  3. prototype ๊ฐ์ฒด๋Š” constructor ๊ฐ์ฒด๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š”๋‹ค.
// ์ƒ์„ฑ์ž ์„ ์–ธ
function Person (name) {
	this.name = name;
};

Person.prototype.getName = function() {
	return this.name;
};

javascript_jquery_basic_3_3a_1

// Person์€ ์–ด๋–ป๊ฒŒ toString()์„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ผ๊นŒ?
function Person (name) {
	this.name = name;
};

Person.prototype.getName = function() {
	return this.name;
};

// toString์€ Person์˜ ์†์„ฑ์ด ์•„๋‹ˆ๋‹ค.
console.log(Person.toString());

Function.toString() ์˜ˆ์ œ
Function.prototype (MDN)

javascript_jquery_basic_3_3a_2

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
function Person (name) {
	this.name = name;
};

Person.prototype.getName = function() {
	return this.name;
};

var person1 = new Person('Lee');
console.log(person1.getName());

new๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•œ๋‹ค.

var person1 = new Person('Lee');

// ์—”์ง„ ๋‚ด๋ถ€์—์„œ ํ•˜๋Š” ์ผ
person1 = {}; // ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ 
Person.call(person1, 'myName'); // call ์ด์šฉํ•ด Person ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ(this๋ฅผ person1๋กœ)
person1.__proto__ = Person.prototype; // ํ”„๋กœํ† ํƒ€์ž…์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

person1.getName(); // 'Lee'

๊ฐ์ฒด์ƒ์„ฑ ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์—ฐ๊ฒฐ

์œ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ์ƒ์„ฑ๋œ๋‹ค.

javascript_jquery_basic_3_3a_3

ํ”„๋กœํ† ํƒ€์ž… ์‹๋ณ„์ž ๊ฒ€์ƒ‰

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ

var a = {
    attr1: 'a'
};

var b = {
    __proto__: a,
    attr2: 'b'
};

var c = {
    __proto__: b,
    attr3: 'c'
};

c.attr1 // 'a'

a์— ์กด์žฌํ•˜๋Š” attr1 ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •

  1. c๊ฐ์ฒด ๋‚ด๋ถ€์— attr1 ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์—†๋‹ค.
  2. c๊ฐ์ฒด์— __proto__ ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. -> ์žˆ๋‹ค.
  3. c๊ฐ์ฒด์˜ __proto__ ์†์„ฑ์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ด๋™ํ•œ๋‹ค. -> b๊ฐ์ฒด๋กœ ์ด๋™
  4. b๊ฐ์ฒด ๋‚ด๋ถ€์— attr1 ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์—†๋‹ค.
  5. b๊ฐ์ฒด์— __proto__ ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. -> ์žˆ๋‹ค.
  6. b๊ฐ์ฒด์˜ __proto__ ์†์„ฑ์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ด๋™ํ•œ๋‹ค. -> a๊ฐ์ฒด๋กœ ์ด๋™
  7. a๊ฐ์ฒด ๋‚ด๋ถ€์— attr1 ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์žˆ๋‹ค. ์ฐพ์€ ์†์„ฑ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์–ด๋–ค ๊ฐ์ฒด์—๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” attr0 ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •

  1. a๊ฐ์ฒด ๋‚ด๋ถ€์— attr0 ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์—†๋‹ค.
  2. a๊ฐ์ฒด์— __proto__ ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. -> ์žˆ๋‹ค.
  3. a๊ฐ์ฒด์˜ __proto__ ์†์„ฑ์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ด๋™ํ•œ๋‹ค. -> Object.prototype๋กœ ์ด๋™
  4. Object.prototype ์—์„œ attr0 ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์—†๋‹ค.
  5. Object.prototype ์—์„œ __proto__ ์†์„ฑ์„ ์ฐพ๋Š”๋‹ค. -> ์—†๋‹ค.

๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๋์€ ํ•ญ์ƒ Object.prototype ์ด๋‹ค. ๊ทธ๋ž˜์„œ Object.prototype์€ __proto__ ์†์„ฑ์ด ์—†๋‹ค. attr0 ๋ผ๋Š” ์†์„ฑ์€ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ Object.prototype์— ์กด์žฌํ•˜์ง€ ์•Š๊ณ  Object.prototype์—๋Š” __proto__ ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋‹ˆ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•˜๊ณ  undefined๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

Clone this wiki locally