Skip to content

javascript_jquery_basic_3_3a

KyusungDev edited this page Mar 16, 2018 · 33 revisions

ν”„λ‘œν† νƒ€μž…μ„ ν†΅ν•œ κ³΅μœ λŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”κ°€?

ν‚€μ›Œλ“œ

  • Prototype
  • __proto__ (ECMAScript λͺ…μ„ΈλŠ” [[prototype]]둜 ν‘œκΈ°)
  • Constructor (ECMAScript λͺ…μ„ΈλŠ” [[construct]]둜 ν‘œκΈ°)

λ‚΄λΆ€ κ΅¬ν˜„

  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());

Object.toString() 예제
Object.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

ν”„λ‘œν† νƒ€μž… 체인의 μˆœν™˜ ꡬ쑰

ν”„λ‘œν† νƒ€μž… 체이닝

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  κ°μ²΄λŠ” μžμ‹ μ˜ λΆ€λͺ¨μΈ prototype 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 참쑰링크 ν˜•νƒœμ˜ μˆ¨κ²¨μ§„ ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€. ECMAScriptμ—μ„œλŠ” 이 링크λ₯Ό 암묡적 링크(implicit link)라고 λΆ€λ₯΄λ©° 이 λ§ν¬λŠ” λͺ¨λ“  객체의 __proto__ ν”„λ‘œνΌν‹°μ— μ €μž₯λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 생성 κ·œμΉ™μ€ λͺ¨λ“  κ°μ²΄λŠ” μžμ‹ μ„ μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” prototype 객체λ₯Ό μžμ‹ μ˜ __proto__ ν”„λ‘œνΌν‹°λ‘œ μ—°κ²°ν•œλ‹€.

ν”„λ‘œν† νƒ€μž… μ²΄μ΄λ‹μ΄λž€ νŠΉμ • 객체의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ, ν•΄λ‹Ή 객체에 μ ‘κ·Όν•˜λ €λŠ” ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œκ°€ μ—†λ‹€λ©΄ __proto__ 링크λ₯Ό 따라 μžμ‹ μ˜ λΆ€λͺ¨ 역할을 ν•˜λŠ” prototype 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°¨λ‘€λŒ€λ‘œ κ²€μƒ‰ν•˜λŠ” 것을 λ§ν•œλ‹€. ν”„λ‘œν† νƒ€μž… 체이닝을 톡해 μžμ‹ μ˜ ν”„λ‘œνΌν‹°λΏλ§Œ μ•„λ‹ˆλΌ, μžμ‹ μ˜ λΆ€λͺ¨μ—­ν• μ„ ν•˜λŠ” prototype 객체의 ν”„λ‘œνΌν‹°μ—λ„ 접근이 κ°€λŠ₯ν•˜λ‹€.

ν”„λ‘œν† νƒ€μž… μ²΄μΈμ—μ„œ μ‹λ³„μž 색인 λ™μž‘

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λ₯Ό λ¦¬ν„΄ν•œλ‹€.

무엇을 ν•  수 μžˆλŠ”κ°€?

ν”„λ‘œν† νƒ€μž… 기반의 객체지ν–₯ 상속을 κ΅¬ν˜„ν•  수 μžˆλ‹€.
ν”„λ‘œν† νƒ€μž… 기반의 상속 κ΅¬ν˜„
ν”„λ‘œν† νƒ€μž… 기반의 상속 κ΅¬ν˜„2
ES6μ—μ„œ class와 extendsλ₯Ό μ΄μš©ν•œ 상속 κ΅¬ν˜„

무엇을 더 μ•Œμ•„μ•Ό ν•˜λŠ”κ°€?

쑰금 더 μš°μ•„ν•˜κ²Œ 상속을 κ΅¬ν˜„ν•˜λŠ” 방법

  • ν”„λ‘œν† νƒ€μž… 상속을 κ΅¬ν˜„ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 방법
  • ES6μ—μ„œ classλ₯Ό μ΄μš©ν•œ 상속 방법

μ‰½κ²Œ μ΄ν•΄ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž… 체인

Clone this wiki locally