arguments 프로퍼티
caller 프로퍼티
length 프로퍼티
name 프로퍼티
__proto__
프로퍼티
prototype 프로퍼티
객체지향 프로그래밍
상속과 프로토타입
프로토타입과 상속
__proto__
라는 프로퍼티를 이용해 간접접근한다.__proto__
는 접근자 프로퍼티이므로, setter, getter 함수를 이용해 프로토타입을 취득 or 교체가 가능하다.__proto__
는 생성된 객체 소유가 아닌 Object.prototype
의 프로퍼티이며 객체는 상속받는 것이다.__proto__
는 순환오류를 체크한다.)__proto__
는 직접 사용보다는 Object.getPrototypeOf(obj)
, Object.setPrototypeOf(obj, proto)
를 이용한 취득 & 교체를 권장한다..함수 객체만이 가지는 prototype 프로퍼티: 생성자 함수가 가지며, 인스턴스의 프로토타입을 가리킨다.
__proto__
와 역시 동일하다.fun.__proto__ === [[Prototype]] === Function.prototype
이지만, fun.prototype과는 다르다.프로토타입의 constructor 프로퍼티
생성자함수로 생성된 객체는 constructor이 생성자를 가리킨다.
리터럴로 생성한 객체는 가상적인 생성자 함수를 가지나, constructor이 반드시 생성자함수를 가리키지 않는다.
Object.prototype
을 프로토타입으로 가진다.Object.prototype
구성자: 생성자 함수Object.prototype
| Object.prototype
|자체 생성자 함수의 프로토타입|const obj = {};
| const obj = new Object();
| const person = new Person();
|인스턴스(최하위)에서부터 Object.prototype
(최상위)까지 차례대로 검색해가며 프로퍼티(메서드도 포함)를 찾는 매커니즘.
Object.prototype
다음인 null
이다.오버라이딩과 프로퍼티 섀도잉
오버로딩은 매개변수의 타입 or 개수가 다름에 따라 다른 내용의 함수가 호출되는 방식 (JS에 내장 X)
생성자 함수에의한 프로토타입의 교체
인스턴스에 의한 프로토타입의 교체
객체 상속관계 변경을 위한 프로토타입 교체는 꽤나 번거롭다.
따라서, 직접 상속을 이용하는 것이 편리하고 안전하다.
객체 instanceof 생성자 함수
좌변의 프로토타입 체인의 상위 === 우변의 객체 ? 참 : 거짓
;Object.create()
이용Object.create(prototype,propertiesObject);
x: {value : 1, . . .}
꼴)장점
ESLint에서는 create로 생성한 객체가 빌트인 메서드(hasOwnProperty()
등) 호출을 권장치 않는다.
const obj = Object.create(null);
obj.x = 1;
obj.hasOwnProperty('x'); // 에러
__proto__
이용```
const myProto = {x : 1};
const obj = {
y: 2,
__proto__ : myProto
}
// const obj = Object.create(myProto,{y : 2}) 와 동일
```
생성자 함수 정의 이후 생성자 함수에 프로퍼티와 메서드를 정의하면 생성자 함수만이 사용할 수 있는 정적 프로퍼티와 메서드가 된다.
Object.creata()
등의 함수는 Object 생성자의 정적 메서드이므로, (당연히 Object.prototype을 상속받은) 다른 객체들임에도 사용할 수 없다.정적 프로퍼티/메서드와 프로토타입 프로퍼티/메서드의 구분이 필요하다.
in
연산자 : key in object
for key in obj
[[Enumable]]
만을 열거하므로 Object.prototype
의 프로퍼티가 열거 XObject.keys / values / entries