March 29, 2021
자바스크립트의 모든 Object는 프로토타입이라는 속성을 가지고 있다.
const person = {
name: 'jessie',
};
const prototype = Object.getPrototypeOf(person);
console.log(typeof prototype); // object
console.log(person.__proto__ === prototype); // true
getPrototypeOf
라는 함수로 프로토타입을 가져올 수 있다.null
또는 object
타입이다.__proto__
라는 이름으로 프로토타입 속성에 접근할 수 있다.__proto__
를 지원하는 것으로 나와있지만 사실 거의 모든 자바스크립트 엔진에서 지원하고 있다.getPrototypeOf
함수를 이용하는 것이다.const person = {
name: 'jessie',
};
const programmer = {
language: 'js',
};
Object.setPrototypeOf(programmer, person); // programmer.__proto__ = person 과 동일
console.log(Object.getPrototypeOf(programmer) === person); // true
console.log(programmer.name); // mike
programmer
의 프로토타입은 person
이 된다.programmer
에는 name
이라는 속성이 없다. 이렇게 자기 자신에 없는 속성에 접근할 때 프로토타입에서 그 속성을 찾는다.
programmer
의 프로토타입은 person
이기 때문에 person
에서 name
을 찾는다.const person = {
name: 'jessie',
};
const programmer = {
language: 'js',
};
const frontend = {
framework: 'react',
};
Object.setPrototypeOf(programmer, person);
Object.setPrototypeOf(frontend, programmer);
console.log(frontend.name, frontend.language); // jessie, js
console.log(frontend.__proto__.__proto__.name, frontend.__proto__.language); // jessie, js
frontend
의 프로토타입은 programmer
이고 programmer
의 프로토타입은 person
이 된다.const person = {
name: 'jessie',
};
const programmer = {
language: 'js',
};
Object.setPrototypeOf(programmer, person);
programmer.name = 'lia';
console.log(programmer.name); // lia
console.log(person.name); // jessie
const person = {
name: 'jessie',
say() {
console.log('hello');
},
};
const programmer = {
language: 'js',
}
Object.setPrototypeOf(programmer, person);
programmer.say(); // hello
programmer
에는 say
함수가 없지만 호출할 수 있다.const person = {
name: 'jessie',
};
const programmer = {
language: 'js',
};
Object.setPrototypeOf(programmer, person);
for (const prop in programmer) {
console.log(prop); // language name
}
for (const prop in programmer) {
if (programmer.hasOwnProperty(prop)) {
console.log(prop); // language
}
}
for (const prop of Object.keys(programmer)) {
console.log(prop); // language
}
hasOwnProperty
메서드나 Object.keys
를 사용하면 된다.function Person(name) {
// this = {};
this.name = name;
// return this;
}
const p1 = new Person('jessie');
console.log(p1.name); // jessie
new
키워드를 사용해서 객체를 만들 때 사용하는 함수를 생성자 함수라고 부른다.new
키워드를 사용해서 함수를 실행하면 자바스크립트 엔진은 내부적으로 this
에 빈 객체를 할당해준다. 그리고 함수가 종료되기 전에 this
를 반환해준다.p1
은 Person
함수에서 반환된 this
이다.function Person(name) {
this.name = name;
this._salary = 0;
}
Person.prototype = {
setSalary(salary) {
this._salary = Math.max(0, Math.min(1000, salary));
},
getSalary() {
return this._salary;
},
}
const p1 = new Person('jessie');
p1.setSalary(2000);
console.log(p1.getSalary); // 2000
const p2 = new Person('lia');
console.log(p1.getSalary === p2.getSalary); // true
p1
과 p2
의 getSalary
, setSalary
메서드가 동일하다.function Person(name) {
this.name = name;
}
console.log(Person.prototype.constructor === Person); // true
constructor
라는 속성이 있다.constructor
는 해당 함수를 가리킨다.