프로토타입
hoonnotes
프로토타입의 생성 시점
프로토타입 객체는
생성자함수가 생성되는 시점에 생성된다!
사용자 정의 생성자 함수
함수와 객체의 가장 큰 차이점
함수는 ( )를 사용하여 호출할 수 있다
- Environment
- FormalParameter
- Call
- Constructor
사용자 정의 생성자 함수
function Person() {}
console.log(Person.prototype); // { constructor f }
const Arrow = () => {}
console.log(Arrow.prototype); // undefined
사용자 정의 생성자 함수
사용자 정의 생성자 함수
Person 생성자 함수
prototype
__proto__
Person.prototype
constructor
__proto__
Function.prototype
Object.prototype
Person
[[Prototype]]
Object.prototype
constructor
...
...
Object
빌트인 생성자 함수
Object 생성자 함수
prototype
__proto__
Object.prototype
constructor
...
Function.prototype
...
Object
객체 생성 방식
객체 생성 방법
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create
- Class
모두 OrdinaryObjectCreate에 의해 생성된다!
객체 생성 방식
객체 리터럴의 프로토타입
const person = { name: 'hoon' };
Object 생성자 함수
prototype
__proto__
Object.prototype
constructor
...
Function.prototype
...
Object
person
name
hoon
[[Prototype]]
생성자 함수로 만든 객체의 프로토타입
const person = new Object();
person.name = "hoon";
Object 생성자 함수
prototype
__proto__
Object.prototype
constructor
...
Function.prototype
...
Object
person
name
hoon
[[Prototype]]
new 키워드로 생성
생성자 함수로 만든 객체의 프로토타입
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log(`${this.name} says hi!`);
};
const hoon = new Person("hoon");
const jane = new Person("jane");
Person 생성자 함수
prototype
Person.prototype
constructor
Person
sayHi
<function>
hoon
name
jane
new 키워드로 생성
hoon
name
jane
[[Prototype]]
프로토타입 체인
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log(`${this.name} says hi!`);
};
const hoon = new Person("hoon");
console.log(Object.getPrototypeOf(hoon) === Person.prototype);
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype);
Person 생성자 함수로 hoon 인스턴스 생성
hoon의 프로토타입은 Person 생성자 함수의 프로토타입
Person 생성자함수의 프로토타입은 Object 생성자함수의 프로토타입
프로토타입 체인
Person 생성자 함수
prototype
Person.prototype
constructor
Person
sayHi
<function>
hoon
name
jane
new 키워드로 생성
hoon
name
jane
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
[[Prototype]]
프로토타입 체인 vs 스코프 체인
전역 스코프
outer
function <object>
puppy
[GLOBAL] 땅콩이
outer 스코프
inner
cat
[OUTER] 순무
function <object>
inner 스코프
person
[INNER] 훈
var puppy = '[GLOBAL] 땅콩이';
function outer() {
console.log(puppy); // [GLOBAL] 땅콩이
var cat = '[OUTER] 순무'
function inner() {
var person = '[INNER] 훈'
console.log(puppy); // [GLOBAL] 땅콩이
console.log(cat); // [OUTER] 순무
console.log(person) // [INNER] 훈
}
console.log(person) // ERROR!
}
프로토타입 체인 vs 스코프 체인
프로토타입 체인:
상속 / 객체의 프로퍼티 조회를 위한 메커니즘
스코프 체인:
스코프 내부에 선언된 식별자 조회를 위한 메커니즘
오버라이딩과 섀도잉
class Animal {
public void makeSound() {
System.out.println("소리질러!");
}
public static void main(String[] args) {
makeSound(); // 소리질러!
}
}
class Dog extends Animal {
// overriding
public void makeSound() {
System.out.println("먕먕!");
}
// overloading
public void makeSound(String status) {
if(status == 'scared') {
System.out.println('아르르..');
} else {
System.out.println('아부부부!');
}
}
public static void main(String[] args) {
makeSound(); // 먕먕!
makeSound('scared'); // 아르르 ...\
makeSound('angry'); // 아부부부!
}
}
오버라이딩
상위 클래스의 메서드를 하위 클래스에서 재정의해서 활용
오버로딩
메서드에 매개변수를 다르게 하여 다른 메서드를 호출
오버라이딩과 섀도잉
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log(`${this.name} says hi!`);
};
const hoon = new Person("hoon");
hoon.sayHi = function () {
console.log(`${this.name}이 돌아왔다!`);
};
hoon.sayHi();
오버라이딩
상위 클래스의 메서드를 하위 클래스에서 재정의해서 활용
오버로딩
메서드에 매개변수를 다르게 하여 다른 메서드를 호출
오버라이딩과 섀도잉
Person 생성자 함수
prototype
Person.prototype
constructor
Person
sayHi
<function>
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
[[Prototype]]
sayHi
<function>
hoon 인스턴스에 존재하는 메소드
오버라이딩!
프로퍼티 섀도잉!
프로토타입 메서드
hoon 인스턴스메서드로 인해 사용되지 않는다!
프로토타입의 교체
프로토타입은 동적으로 변경될 수 있다!
프로토타입의 교체
function Person(name) {
this.name = name;
}
Person.prototype = {
sayHello() {
console.log(`Hello i'm ${this.name}`);
},
};
const hoon = new Person("hoon");
hoon.sayHello();
프로토타입의 교체
Person 생성자 함수
prototype
Person.prototype
constructor
Person
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
Person 생성자 함수
prototype
Person.prototype
sayHello
<function>
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Object 생성자함수
prototype
Object.prototype
constructor
Object
...
...
...
...
[[Prototype]]
프로토타입이 객체리터럴로 교체되어 constructor 프로퍼티가 없다!
프로토타입의 교체
function Person(name) {
this.name = name;
}
Person.prototype = {
constructor: Person,
sayHello() {
console.log(`Hello i'm ${this.name}`);
},
};
const hoon = new Person("hoon");
hoon.sayHello();
Person 생성자 함수
prototype
Person.prototype
constructor
Person
sayHello
<function>
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
[[Prototype]]
프로토타입의 교체
인스턴스에 의한 프로토타입 교체
function Person(name) {
this.name = name;
}
const hoon = new Person("hoon");
const randomePrototype = {
sayHello() {
console.log(`Hello i'm ${this.name}`);
},
};
Object.setPrototypeOf(hoon, randomePrototype);
hoon.sayHello();
Person 생성자 함수
prototype
randomPrototype
sayHelllo
<function>
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
프로토타입의 교체
instanceof
생성자 함수가 프로토타입 체인상 존재하는지 확인
function Person(name) {
this.name = name;
}
const hoon = new Person("hoon");
// prototype chining 위에 person이 있으니 true
console.log(hoon instanceof Person);
// prototype chining 위에 Object도 있으니 true
console.log(hoon instanceof Object);
instanceof
Person 생성자 함수
prototype
Person.prototype
constructor
Person
hoon
name
new 키워드로 생성
hoon
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
[[Prototype]]
object.create
객체를 생성하는 방법중 하나
추상연산 OrdinaryObjectCreate을 호출
new 연산자 없이도 새로운 객체를 생성
프로토타입을 직접 지정하여 객체를 생성
객체 리터럴로 만들어진 객체도 상속가능
object.create
// 프로토타입이 null인 객체를 생성
let obj = Object.create(null);
console.log(obj);
console.log(Object.getPrototypeOf(obj) === null);
// obj = {} 와 동일
obj = Object.create(Object.prototype);
console.log(Object.getPrototypeOf(obj) === Object.prototype);
//obj = {x: 1}과 동일
obj = Object.create(Object.prototype, {
x: { value: 1, writable: true, enumerable: true, configurable: true },
});
console.log(obj.x);
정적 프로퍼티 메서드
Static 프로퍼티 / 메서드
생성자함수에서 바로 사용 가능!
굳이 인스턴스를 만들지 않아도 된다
정적 프로퍼티 메서드
function Article(title, content, publishedDate = new Date()) {
this.title = title;
this.content = content;
this.publishedAt = publishedDate;
}
// prototype method
Article.prototype.getArticleInfo = function () {
return `${this.title}: ${
this.content.length < 20 ? `${this.content.slice(0, 20)}...` : this.content
}`;
};
// static property
Article.publisher = "Hoon";
Article.isRecentlyPublished = function (articleInstance) {
return (
(new Date().getTime() - articleInstance.publishedAt.getTime()) /
(1000 * 60 * 60 * 24 * 3)
);
};
const post = new Article("제목", "내용", new Date());
console.log(post);
정적 프로퍼티 메서드
Article 생성자 함수
prototype
Article.prototype
constructor
Article
post1
title
new 키워드로 생성
자바스크립트
[[Prototype]]
Function.prototype
constructor
Object.prototype
constructor
Object
...
...
Function
...
...
[[Prototype]]
[[Prototype]]
[[Prototype]]
content
글 내용..
publishedAt
2022-...
getArticleInfo
<function>
프로토타입에 등록된 메소드!
publisher
isRecentlyPublished
hoon
<function>
생성자 함수에 등록된 static 프로퍼티
10-2. 프로토타입
By hoonnotes
10-2. 프로토타입
- 69