const me = new Person("Lee"); console.log(me.__proto__ === Person.prototype); // true console.log(Object.getPrototypeOf(me) === Person.prototype); // true
// Own은 직접적으로 갖는 프로퍼티를 뜻한다. 하지만 __proto__는 상속받은 프로퍼티이다. console.log(Object.getOwnPropertyDescriptor(me, "__proto__")); //undefined console.log(Object.getOwnPropertyDescriptor(Person.prototype, "__proto__")); //undefined
console.log(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__")); /* { get: [Function: get __proto__], set: [Function: set __proto__], enumerable: false, configurable: true } */
// 모든 객체는 Object.prototype의 __proto__를 상속받아 사용한다. = Object.prototype가 최상위 객체이다. console.log(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__")); /* { get: [Function: get __proto__], set: [Function: set __proto__], enumerable: false, configurable: true } */
in, Reflect, hasOwnProperty
in 연산자는 상속까지 고려해서 프로퍼티 키를 찾지만 hasOwnProperty는 상속을 고려하지 않는다.
// in 연산자 const person = { name: "Lee", address: "Seoul", };
// person 객체에 name 프로퍼티가 존재한다. console.log("name"in person); // true // person 객체에 address 프로퍼티가 존재한다. console.log("address"in person); // true // person 객체에 age 프로퍼티가 존재하지 않는다. console.log("age"in person); // false // 확인 대상 객체가 상속받은 모든 프로토타입의 프로퍼티를 확인한다. console.log("toString"in person); // true /*************************************************/
// 빨간 줄이 뜬다. // hasOwnProperty를 사용하지 못하는 경우가 있기 때문이다. console.log(o.hasOwnProperty("apple")); //true
const x = Object.create(null); // 위 같은 경우 종점이다. hasOwnProperty를 사용하지 못한다. // 위의 빨간 줄은 이런 경우를 방지하기 위해 아래 방법을 추천하는 것이다.
// hasOwnProperty 메소드의 this로 o를 사용하는 것이다. // Object.prototype.hasOwnProperty를 call 해주는 것이다. console.log(Object.prototype.hasOwnProperty.call(o, "apple")); //true /***********************/
// 프로토타입 메서드 // 반드시 인스턴스로 호출해야함. Person.prototype.sayHello = function () { console.log(`Hi, I am ${this.name}`); // Hi, I am Lee
// 인스턴스 굳이 만들어서 Hi 출력할 바에 정적 메서드로 쓴다. console.log(`Hi!`); // Hi! };
// 정적 메서드 Person.sayHello = function () { // this는 인스턴스를 위한 것이기 때문이다. console.log(`Hi, I am ${this.name}`); // Hi, I am Person
// 정적 메서드는 인스턴스 생성 없고, this 없는 것을 위한 메서드이다. console.log(`Hi!`); // Hi! };
const me = new Person("Lee"); me.sayHello(); // Hi, I am Lee
// 정적 메서드에서는 this를 안 쓴다. this를 쓴다는 것은 인스턴스를 본다는 의미이다. // 정적 메서드는 인스턴스를 호출하는 것이 아니라 생성자 함수를 가져오기 때문에 this를 쓰지 않는다. Person.sayHello(); // Hi, I am Person