hoonnotes
// 빈 객체 생성
const person = new Object();
// 객체에 name 프로퍼티 설정
person.name = "Hoon";
// 객체에 sayHello 메서드 설정
person.sayHello = function () {
console.log(`Sup, it's yo homie ${this.name}`);
};
console.log(person.name);
person.sayHello();
const person1 = {
firstName: 'Hoon',
lastName: 'Oh',
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
console.log(person1.getFullName())
const person2 = {
firstName: 'Jimmie',
lastName: 'Carter',
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
console.log(person2.getFullName())
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
};
}
const person1 = new Person('Hoon', 'Oh')
const person2 = new Person('Jimmie', 'Carter')
console.log(person1.getFullName())
console.log(person2.getFullName())
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
};
}
function Person(firstName, lastName) {
console.log(this); // Person {}
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
};
}
const person1 = new Person("Hoon", "Oh");
function Person(firstName, lastName) {
console.log(this); // Person {}
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
};
console.log(this);
/**
* Person {
firstName: 'Hoon',
lastName: 'Oh',
getFullName: [Function (anonymous)]
}
*/
}
function Person(firstName, lastName) {
console.log(this); // Person {}
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
};
console.log(this);
/**
* Person {
firstName: 'Hoon',
lastName: 'Oh',
getFullName: [Function (anonymous)]
}
*/
}
const person1 = new Person("Hoon", "Oh");
console.log(person1);
/**
* Person {
firstName: 'Hoon',
lastName: 'Oh',
getFullName: [Function (anonymous)]
}
*/
function sayHi() {}
sayHi.name = 'Hoon';
sayHi.method = function() {
console.log(`Hi! I'm ${this.name}`)
}
sayHi.method()
sayHi는 함수이지만, 일반 객체처럼 사용 가능!
함수와 객체의 가장 큰 차이점
함수는 ( )를 사용하여 호출할 수 있다
callable: 내부 메서드 [[call]] 이 있는 객체는 호출이 가능
constructor: 내부 메서드 [[construct]]가 있는 객체는 생성자로 활용 가능
function sayHi() {}
// 함수를 호출하면 [[Call]]이 호출된다
sayHi()
// 함수를 생성자 함수로 사용하면 [[Construct]]가 호출된다
new sayHi()
자바스크립트가 constructor 함수를 구분하는 방법:
// 일반 함수 정의: 함수 선언문과 함수 표현식
function first() {}
const second = function () {};
const myObject = {
// 프로퍼티 third에 할당된 함수로, 일반 함수로 정의된 함수
third: function () {},
};
new first(); // first {}
new second(); // second {}
new myObject.third(); // third {}
const arrow = () => {}
new arrow() // TypeError! not a constructor
const secondObject = {
method() {}
}
new secondObject.method() // TypeError! not a constructor
자바스크립트가 생성자 함수를 실행하는 방법!
function createUser(name, role) {
return { name, role };
}
const employee = new createUser('Hoon', 'Marketing Manager');
console.log(employee);
// { name: "Hoon", role: "Marketing Manager" }
따라서 파스칼 케이스 함수도,
new 키워드가 없으면 일반함수로 실행된다!
function User(name, role) {
this.name = name;
this.role = role;
}
const employee1 = User('Hoon', 'Marketing Manager');
console.log(employee1); // undefined
const employee2 = new User('Hoon', 'Server Engineer');
console.log(employee2);
// User { name: 'Hoon', role: 'Server Engineer' }
생성자 함수가 생성자 함수로 실행될 수 있게 해주는 방법
파스칼 케이스로 작성
new.target을 사용!
메타 프로퍼티
컨스트럭터 함수 내부에서 this처럼 사용된다
new 키워드로 실행되지 않으면, undefined값 할당
function Circle(radius) {
// 생성자로 호출되지 않았다면 new.target 값은 undefined로 설정된다
if (!new.target) {
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
const circle = Circle(5); // new 키워드가 없어도 생성자로 생성이 가능하다!