하루 30분 모던 자바스크립트 딥 다이브 프로토타입3

instanceof 연산자

  1. 좌변은 객체를 가리키는 식별자, 우변에는 생성자 함수를 가리키는 식별자를 피연산자로 받는다.
  2. 우변이 함수가 아닌 경우 TypeError
  3. 불리언 값은 반환받는다
  4. 프로토타입의 constructor 프로퍼티가 가리키는 생성자 함수를 찾는게 아니라, 생성자 함수의 prototype에 바인딩딘 객체가 프로토타입 체인 상에 존재하는지 확인하는 것
  5. Constructor에 영향을 받지 않는다.

직접 상속

Object.create에 의한 직접 상속

  1. Object.create메서드는 프로토타입을 지정하여 새로운 객체를 생성한다.
  2. new 연산자 없이 객체 생성 가능
  3. 프로토타입을 지정하여 객체 생성 가능
  4. 객체 리터럴에 의해 생성된 객체도 상속받을 수 있다.
  5. 프로토타입 체인의 종점에 위치하는 객체는 Object.prototype의 빌트인 메서드를 사용할 수 없으므로 Object.prototype의 빌트인 메서드를 객체가 직접 호출하는 것은 권장하지 않는다.
  6. Function.prototype.call 메서드와 같이 간접적으로 호출하는 것이 좋다.

객체 리터럴 내부에서 __Proto__에 의한 직접 상속

  1. ES6에서 부터 객체 리터럴 내부에서 접근자 프로퍼티를 사용하여 직접 상속 구현 가능

정적 프로퍼티와 메서드

  1. 정적 프로퍼티/메서드는 인스턴스를 생성하지 않아도 참조/호출 가능.
  2. 생성자 함수가 생성한 인스턴스로 참조/호출할 수 없다.
  3. 참조/호출할 수 있는 프로퍼티/메서드는 프로토타입 체인 상에 존재해야 한다.
  4. this를 사용하지 않는다면 그 메서드는 정적 메서드.
  5. 표기법만으로도 정적 프로퍼티/메서드와 프로토타입 프로퍼티/메서드를 구별할 수 있어야 한다. (p.305)

프로퍼티 존재 확인

  1. in연산자로 프로퍼티 존재 확인 가능. 반환값은 불리언 값이다.
  2. ES6에 도입된 Reflect.has 메서드를 사용할 수도 있다. in과 동일하게 동작.
  3. Object.prototype.hasOwnProperty메서드를 이용해 특정 프로퍼티가 존재하는지 확인할 수 있다. 반환값은 불리언 값.

프로퍼티 열거

for…in 문

  1. 객체의 프로퍼티 뿐 아니라, 상속받은 프로토타입의 프로퍼티까지 열거한다.
  2. [[Enumerable]]값이 true값일 때 열거한다.
  3. 따라서 객체의 프로토타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중 프로퍼티 어트리뷰트 [[Enumerable]]값이 true인 프로퍼티를 순회하며 열거하는 것.
  4. 심벌은 열거하지 않는다.
  5. 상속받은 프로퍼티를 제외하려면 Object.prototype.hasOwnProperty를 사용하여 객체 자신의 프로퍼티인지 확인하면 된다.
  6. 대부분의 브라우저는 순서를 보장하지만, 무조껀 순서를 보장해주진 않으니 주의해야 한다.
  7. 배열에선 for …in문 보다 forEach, for …of문을 사용하는 것이 권장된다.