Instantiation Pattern은 JS로 무언가를 만드는 방법
: 함수 생성 → 함수 내에서 빈 객체를 만들고 속성과 메서드를 추가한 후 객체를 return한다.
let Animal = function(name) {
let object = {};
object.name = name;
object.eat = function() {
// code goes here
}
return object;
}
let rabbit = Animal("토끼");
carrot.eat();
: 함수 생성 → 함수 내에서 빈 객체를 만들고 속성 정의 → 다른 객체에 메서드를 정의해준 후 함수 내의 객체에서 주소값만 참조
let extend = function(object, method) {
for(let key in method) {
object[key] = method[key]
}
}
let Animal = function(species, name) {
let object = {};
object.species = species;
object.name = name;
extend(object, objMethod)
return object;
}
let objMethod = {
eat: function() {
// code goes here
}
sleep: function() {
// code goes here
}
}
let tiger = Animal("호랑이", "호랑이");
tiger.eat();
tiger.sleep();
: prototype chain을 사용하여 객체를 만든다. (Object.create 사용)
별도의 객체에 모든 메서드를 작성 → 함수를 생성 → 함수 안에서 Object.create 메서드를 사용하여 메서드를 참조한다. → 함수 내부의 속성을 정의한 후 객체를 return
let Animal = function(species, name) {
let object = Object.create(objMethod);
object.species = species;
object.name = name;
return object;
}
let objMethod = {
eat: function() {
// code goes here
}
makeSound: function() {
// code goes here
}
}
let tiger = Food("호랑이", "호랑이");
tiger.eat();
tiger.makeSound();
-: 함수 생성 → this 키워드를 사용하여 속성 정의 → 메서드는 prototype에 정의 → 인스턴스 객체 만들 때 new 키워드 사용
let Animal = function(species, name) {
this.species = species; // this 키워드 사용
this.name = name;
}
Animal.prototype.eat = function() {
// code goes here
}
Animal.prototype.makeSound = function() {
// code goes here
}
let tiger = Food("호랑이", "호랑이"); // 라면을 먹는 중입니다.
tiger.eat();
tiger.makeSound();
/ pseudo = 가짜의, 가짜로 class 개념을 흉내내는 방식. /
call/apply를 통해 부모 생성자 함수와 연결. 자식 생성자 함수의 prototype 객체를 Object.create 메서드를 통해 부모 생성자 함수의 prototype과 연결. 자식 생성자 함수의 constructor를 자기 자신으로 재할당.Object.create()을 실행한다. (새로운 주소값을 가지고 새로운 프로토타입 객체 생성)*apply(): fn.apply(thisArg, [argsArray]) / this 인자를 첫번째 인자로 받고, 두번째 인자로는 배열을 받음
Reference:
Instantiation Patterns in JavaScript