프로토타입도 객체이기 떄문에 그냥 객체로 바꿀 수가 있다.
function Person(name) {
this.name = name
}
const me = new Person('Kim');
위 그림은 이 코드의 결과이고 Person의 프로토타입을 바꾸는 방법은
const Person = (function(){
function Person(name){
this.name=name;
}
Person.prototype = {
sayHello(){
console.log(this.name)
}
}
return Person
})
이렇게 코드를 짜서 me에 Person객체를 할당하면 Person.prototype는 constructor는 없고 sayHello만 있는 객체로 교체된다.
그래서 아래처럼 constructor연결해주는 코드를 추가해 줘야한다.
const Person = (function(){
function Person(name){
this.name=name;
}
Person.prototype = {
constructor: Person
sayHello(){
console.log(this.name)
}
}
return Person
})
다른방법으로는 Object.setPrototypeOf()
를 사용하는 방법이다
const parent = {
sayHello(){
console.log(this.name)
}
};
Object.setPrototypeOf(me, parent);
이렇게 하면 Person.prototype이 parent객체로 바뀌는데 앞에서 생성자 함수 내부에 정의한것과는 결과가 다르다.
어떻게 다르냐면
Object.setPrototypeOf()
은 프로토타입 자체를 다른 객체로 교체하는 것이라 Person 생성자 함수가 교체된 프로토타입인 parent객체를 모른다.그래서 생성자 함수에서 했던것 처럼 프로토타입이랑 생성자 함수랑 연결을 해줘야 한다.
const parent = {
constructor: Person
sayHello(){
console.log(this.name)
}
};
Person.prototype = parent
Object.setPrototypeOf(me, parent);
정적 프로퍼티 메소드는 생성자 함수로 인스턴스를 생성하지 않아도 참조, 호출할 수 있는 프로퍼티 메소드 이다.
Person.staticProp = 'static prop';
Person.staticMethod = function (){
console.log('static method')
}
Person.staticMethod();
me.staticMethod(); // TypeError
이렇게 하면 Person객체가 자기만의 값을 가지기 때문에 me에 이 정적 프로퍼티 메소드를 넘겨주지 않는다.
📌 이름을 굳이 staticMethod, staticProp 이렇게 안해도 잘된다.
파이썬의 for in 처럼 자바스크립트에도 for in이 있는데 좀 다르다
파이썬은 for in 하면 배열의 요소를 순회하지만 자바스크립트의 for in은 객체의 모든 프로퍼티를 순회한다.
파이썬의 for in과 같은건 for of 라고 따로 있다.
const person = {
name: 'Kim',
address: 'Seoul'
};
for(const key in person){
console.log(key + ': ' + person[key]);
}
// name: Kim
// address: 'Seoul
위의 코드처럼 사용하면 된다.
person을 in으로 순회하기 때문에 key는 name, address순으로 정의된다.
여기서 문제가 있는데 for in 은 상속받은 프로토타입의 프로퍼티까지 열거한다.
대신 프로퍼티 어트리뷰트 [[Enumerable]]값이 true인 프로퍼티만 순회한다.
그래서 위의 예시에서 Object.prototype의 프로퍼티인 toString 같은 애들이 출력되지 않은것이다.
또한 프로퍼티 키가 심벌인 경우에도 열거하지 않는다.
📌 그래서 만약 사용하게 된다면 for문 안에 hasOwnProperty
로 자신의 프로퍼티인지 확인하는 조건문을 걸어주는게 좋다.
❗️ 만약 배열에 for in 을 사용하면 배열도 객체이기 때문에 순회하고 배열의 인덱스가 프로퍼티이기 때문에 인덱스 값이 열거된다.