/* 생성자 함수 선언 */
function Person(name, age) {
    this.name = name;
    this.age = age;
}
  
/* Person 생성자 함수를 사용하여 새로운 객체 생성 */
const person1 = new Person("둘리", 15); // person1 객체 생성
console.log(person1.name); // "둘리"
console.log(person1.age); // 15

const person2 = new Person("마이콜", 28); // person2 객체 생성
console.log(person2.name); // "마이콜"
console.log(person2.age); // 28
/* 생성자 함수 선언 */
function Person(name, age) {
    // this는 생성된 새로운 객체를 가리킵니다.
    this.name = name;  // 새로운 객체의 name 속성을 초기화합니다.
    this.age = age;    // 새로운 객체의 age 속성을 초기화합니다.
}
  
/* Person 생성자 함수를 사용하여 새로운 객체 생성 */
const person1 = new Person("둘리", 15); // person1 객체 생성
console.log(person1.name); // "둘리" (person1의 name 속성)
console.log(person1.age);  // 15 (person1의 age 속성)

const person2 = new Person("마이콜", 28); // person2 객체 생성
console.log(person2.name); // "마이콜" (person2의 name 속성)
console.log(person2.age);  // 28 (person2의 age 속성)

/* 설명:
 - 생성자 함수 내에서 `this` 키워드는 생성된 새로운 객체를 가리킵니다.
 - 예를 들어, `person1` 객체가 생성될 때 `this.name`은 `person1.name`을, `this.age`는 `person1.age`를 의미합니다.
 - 마찬가지로, `person2` 객체가 생성될 때 `this.name`과 `this.age`는 각각 `person2` 객체의 속성을 의미합니다.
 - 이처럼 생성자 함수는 `this`를 사용하여 각 객체의 속성과 메서드를 고유하게 초기화합니다.
*/
/* 생성자 함수 */

// 생성자 함수 정의
function Person(name, age) {
    this.name = name;  // this는 새로 생성된 객체를 가리킵니다.
    this.age = age;
}
  
// Person 생성자 함수를 사용하여 새로운 객체 생성
const person1 = new Person("홍길동", 30);
console.log(person1.name); // "홍길동" - this를 통해 객체의 속성에 접근
console.log(person1.age);  // 30

////////////////

/* 일반 함수 */

// 일반 함수 정의
function showThis() {
console.log(this);  // this는 호출되는 환경에 따라 다릅니다.
}

// 일반 함수 호출 - 전역 객체를 가리킵니다 (브라우저에서는 window)
showThis(); // 전역 객체 (브라우저에서는 window)

// 객체를 생성하고 메서드 정의
const obj = {
name: "Bob",
showThis: showThis // 객체의 메서드로서 일반 함수 참조
};

// 객체의 메서드 호출 - this는 해당 객체를 가리킵니다.
obj.showThis(); // obj 객체
  
const obj = new Object(); 
obj.name = "홍길동";
console.log(obj); // {name: '홍길동'}
const arr = new Array(1, 2, 3); 
console.log(arr); // [1, 2, 3]
const str = new String("Hello");
console.log(str); // "Hello"
const num = new Number(123);
console.log(num); // 123
const bool = new Boolean(true);
console.log(bool); // true
const sum = new Function("a", "b", "return a + b");
console.log(sum(2, 3)); // 5
const date = new Date();
console.log(date); // 현재 날짜와 시간 출력
const regex = new RegExp("\\d+", "g"); 
const result = "123abc".match(regex); 
console.log(result); // ['123']
const error = new Error("뭔가 오류가 있어요.");
console.log(error.message); // "뭔가 오류가 있어요."
const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("Done!"), 1000);
});
promise.then(result => console.log(result)); // 1초 후 "Done!" 출력
const url = new URL("https://example.com/path?name=John&age=30");

// URL의 프로토콜, 호스트, 경로 등을 접근할 수 있습니다.
console.log(url.protocol); // "https:"
console.log(url.host);     // "example.com"
console.log(url.pathname); // "/path"
console.log(url.search);   // "?name=John&age=30"

// URL 검색 매개변수 수정
url.searchParams.set("name", "Doe");
console.log(url.href); // "https://example.com/path?name=Doe&age=30"