const person = new Object();
person.name = 'Lee';
person.sayHello = function(){
console.log(`Hi! My name is ${this.name}.`);
};
console.log(person); // {name: 'Lee', sayHello: f}
person.sayHello(); // Hi! My name is Lee.
const strObj = new String('Lee');
console.log(typeof strObj); // object
console.log(strObj); // String {'Lee'}
const numObj = new Number('123');
console.log(typeof numObj); // object
console.log(numObj); // Number {123}
const boolObj = new Boolean(true);
console.log(typeof boolObj); // object
console.log(boolObj); // Boolean {true}
const func = new Function('x', 'return x * x');
console.log(typeof func); // function
console.dir(func); // f anonymous(x)
const arr = new Array(1, 2, 3);
console.log(typeof arr); // object
console.log(arr); // [1, 2, 3]
const regExp = new RegExp(/ab+c/i);
console.log(typeof regExp); // object
console.log(regExp); // /ab+c/i
const date = new Date();
console.log(typeof date); // object
console.log(date); // Mon May 04 2020 08:36:33 GMT+0900 (대한민국 표준시)
const circle1 = {
radius: 5,
getDiameter() {
return 2 * this.radius;
}
};
console.log(circle1.getDiameter()); // 10
const circle2 = {
radius: 10,
getDiameter() {
return 2 * this.radius;
}
};
console.log(circle2.getDiameter()); // 20
// 생성자 함수
function Circle(radius) {
this.radius = radius;
this.getDimeter = function() {
return 2 * this.radius;
};
}
// 인스턴스 생성
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20
// 생성자 함수
function Circle(radius) {
// 인스턴스 초기화
this.radius = radius;
this.getDimeter = function() {
return 2 * this.radius;
};
}
// 인스턴스 생성
const circle1 = new Circle(5);
인스턴스 생성과 반환 과정
1. 인스턴스 생성과 this 바인딩
// 생성자 함수
function Circle(radius) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.
console.log(this); // Circle {}
// 2. this에 바인딩되어 있는 인스턴스를 초기화 한다.
this.radius = radius;
this.getDimeter = function() {
return 2 * this.radius;
};
// 3. 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.
}
// 인스턴스 생성
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}
// 일반 함수 정의 : 함수 선언문, 함수 표현식
function foo() {}
const bar = function () {};
const baz = {
x: function() {} // 일반 함수로 정의된 함수이므로 메서드로 인정하지 않는다
}
// constructor
new foo(); // foo {}
new bar(); // bar {}
new baz.x(); // x {}
// non-constructor
const arrow = () => {};
new arrow(); // TypeError
const obj = {
x() {} // ES6의 메서드 축약 표현만 메서드로 인정한다.
}
new obj.x(); // TypeError
function Circle(radius) {
if(!new.target) {
return new Circle(radius);
}
this.radius = radius;
this.getDimeter = function() {
return 2 * this.radius;
};
}
const circle = Circle(1); // new 없이 생성자 함수 호출
console.log(circle.getDimeter());
function Circle(radius) {
if(!(this instanceof Circle)) { // 스코프 세이프 생성자 패턴
return new Circle(radius);
}
this.radius = radius;
this.getDimeter = function() {
return 2 * this.radius;
};
}