inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드팩토리] [입문] 9시간만에 끝내는 코드팩토리의 Javascript 무료 풀코스

Prototype (프로토타입)

Object.setPrototype(ray, IdolModel.prototype); 호출 후, ray.dance()가 실행되는 이유를 모르겠어요

494

yunjcho

작성한 질문수 4

1

섹션3 prototype 강의에서 Object.setPrototype(ray, IdolModel.prototype);을 실행한 후에도 ray.dance()가 실행됩니다.

instanceof를 사용해서 확인한 결과, false가 출력되므로 ray.dance()에서 에러가 발생해야 한다고 생각했는데 제가 잘 못 이해하고 있을까요?

Object.setPrototypeOf(ray, IdolModel.prototype);
console.log(ray.sayHello());
console.log(ray.dance()); //왜 실행되는지?
console.log("ray's type: ",ray instanceof FemaleIdolModel);

javascript

답변 2

0

김민영

저도 같은 의문이었는데 해결됬습니다. 감사합니다!

0

코드팩토리

안녕하세요!

실행 가능한 전체 예제 코드를 보여주시기 바랍니다!

댓글 달아주시면 다시 답변 드릴게요!

감사합니다!

0

yunjcho

전체 예제 코드는 아래와 같습니다

function IdolModel(name, year) {
	this.name = name;
	this.year = year;
}

IdolModel.prototype.sayHello = function() {
	return `${this.name} 인사를 합니다.`;
}

function FemaleIdolModel(name, year) {
	this.name = name;
	this.year = year;

	this.dance = function() {
		return `${this.name}가 춤을 춥니다.`;
	}
}

const gaEul = new IdolModel('가을', 2002);
const ray = new FemaleIdolModel('레이', 2004);

console.log(gaEul.__proto__);
console.log(gaEul.__proto__ === IdolModel.prototype);
console.log(Object.getPrototypeOf(gaEul) === IdolModel.prototype); //gaEul 인스턴스의 __proto__를 가져옴

console.log();

console.log(gaEul.sayHello());
console.log(ray.dance());
console.log(Object.getPrototypeOf(ray) === FemaleIdolModel.prototype);
// console.log(ray.sayHello()); // 해당 메소드가 클래스 안에 없어서 실행 불가

Object.setPrototypeOf(ray, IdolModel.prototype); //이미 생성된 객체에 __proto__를 수정함으로서 이전에 호출하지 못한 함수를 호출 할 수 있게 됨
console.log(ray.sayHello());
console.log(ray.dance()); //?
console.log("ray's type: ",ray instanceof FemaleIdolModel);

console.log(ray.constructor === FemaleIdolModel); //false
console.log(ray.constructor === IdolModel); //true
console.log(Object.getPrototypeOf(ray) === FemaleIdolModel.prototype); //false - 기존 연결이 끊김
console.log(Object.getPrototypeOf(ray) === IdolModel.prototype); //false - 기존 연결이 끊김
console.log(FemaleIdolModel.prototype === IdolModel.prototype); //false

FemaleIdolModel.prototype = IdolModel.prototype;

1

코드팩토리

this.dance에 함수를 할당할경우 name과 year처럼 인스턴스에 직접 귀속됩니다. 아래 예제를 확인해보시면 조금 더 쉽게 확인 할 수 있습니다. toString()을 실행이 가능하지만 직접 들고있는 프로퍼티인지 확인하는 hasOwnProperty를 사용하면 dance의 경우 true가 나오지만 프로퍼티 체인을 통해 상속 받는중인 toString은 false가 나옵니다.

 

image

0

yunjcho

감사합니다!

EXPLOPER에서 파일을 삭제하는 방법을 알려주세요 ㅜㅜ

0

100

2

&& ||가 너무 햇갈려요

0

97

2

js에선 string값이 아스키코드값으로 저장되지 않나요?

0

72

2

여러줄에 주석 쓰는 방법 질문

0

119

1

출력이안되요 ㅜㅜ

0

821

3

선생님, 감사해요

0

250

2

Factory Constructor를 언제 사용하나요?

0

231

2

n개의 await를 사용하면, 이들은 promise chaining 처럼 동작하나요?

0

168

1

안유진을 얼마만큼 좋아하시는 건가요?

7

470

2

단축 평가 (short circuit evaluation) 패턴 관련 질문있습니다.

0

217

1

클래스를 써야할때와 함수를 써야할때

0

314

2

혹시 공부한 내용을 개인 블로그(티스토리 등)에 요약해서 올려도 될까요 ?

0

335

1

Copy by Value에 대해 질문있습니다!

0

257

2

메모리 강의 중 메모리 활용 부분 질문드립니다.

0

274

1

Super Keyword 질문 있어요!

0

333

1

Static Keyword 질문 있어요!

0

272

1

선생님 저 멍청한거 맞죠?

0

745

2

sort 함수에 대해 궁금한 점이 있습니다.

0

435

1

대소관계 비교할 때 문자열과 비교할 경우

0

349

1

const 에서

0

408

1

함수 안 변수 키워드를 var를 사용하시는 이유가 궁금합니다.

0

552

1

Arrow 함수 질문있습니다.

2

363

1

scope에 대해 질문 있습니다.

0

320

1

Ts 가 목표인데 Prototype Chain 부분 정확하게 이해하고 넘어가야 할까요?

0

552

1