YeonjuOHYE / javascript

0 stars 0 forks source link

유돈노 #part2#5) 프로토타입 #19

Open YeonjuOHYE opened 4 years ago

YeonjuOHYE commented 4 years ago

5.1 [[Prototype]]

자바스크립트 객체는 [[Prototype]] 이라는 내부 프로퍼티가 있고 이는 다른 객체를 참조하는 단순 레퍼런스로 사용 생성시점에 이 프로퍼티데 null 이 아닌 값이 할당됨

5.1.1 Object.prototype

[[Prototype]] 연쇄가 끝나는 지점은 Object.prototype에서 끝난다. 모든 객체는 Object.prototype 객체의 자손 Object.prototype에는 자바스크립트에서 두루 쓰이는 다수의 공용 유틸리티가 포함되어 있다.

5.1.2 프로퍼티 세팅과 가려짐

가려짐이란? 연쇄의 값이 최하위 값에 가려지는 것

셋팅의 결과는 다음 세가지 경우의 수에 따른다. 1) 상위 수준 프로퍼티가 읽기 전용이 아닌 경우 가려짐 2) 상위 수준 프로퍼티가 읽기 전용이면 안려진다. 에러 발생 3) 상위 수준 프로퍼티가 세터일 경우 무조건 이 세터가 호출되어 하위에 값 추가하지 않으며, 세터를 재정의 하는 일 또한 없다.

가려짐은 지양해라~(=> 작동 위임이 대안이 된다.)

5.2 클래스

5.2.1 클래스 함수

클래스란 프로토타입 (공용/열거불가 프로퍼티 )을 가지는 것을 의미 new Foo() 로 만들어진 모든 객체는 결국 Foo.prototype 객체와 [[Prototype]] 링크로 연결된다.

[[Prototype]]객체를 다른 말로 프로토타입 상속이라고도 하는데 상속은 복사를 수반함으로 Prototype 상속이라는 말보다는 위임이라는 말이 적당하다.

5.2.2 생성자

Foo.prototype 객체에는 기본적으로 .constructor가 셋팅됨 이는 객체 생성과 관련된 함수를 다시 참조하기 위한 래퍼런스 new Foo()로 생성한 객체 a도 .constructor 프로퍼티를 갖고 있다.

생성자냐 호출이냐? new 키워드는 일반 함수앞에도 붙일 수 있고 (앞의 Foo도 사실 함수) 이게 붙으면 함수 실행외에 객체 생성이라는 잔업을 더 하게 되는 것이다.

5.2.3 체계

new Foo로 생성된 객체 a가 Foo의 프로퍼티를 사용할 수 있는 것은 [[Get]] 호출시 [[Prototype]] 링크를 타고 Foo의 프로퍼티까지 들어가기 때문

돌아온 생성자 new Foo로 생성된 객체의 .constructor 도 Foo.prototype에 위임된 레퍼런스 그래서 Foo.prototype 의 링크를 바꾸면 .constructor 도 바뀌어 위험하다.

5.3 프로토타입 상속

(1)Bar.prototype = Object.create(Foo.prototype) (2)Bar.prototype = Foo.prototype Bar 를 수정하면 Foo에도 영향을 미침 (3)Bar.prototype = new Foo(); Foo를 호출하게 됨으로 불필요한 내용까지 호출하게 될 수 있다. (4)Object.setPrototypeOf(Bar.prototype, Foo.prototype) ▲ (1), (4)는 둘 다 괜찮지만 (1) 가비지 컬렉터 수행되는 점에서 성능상 단점이 (4) (1)보다 가독성 면에서 단점이 있다.

5.3.1 클래스 관계 조사

(1)

a instanceof Foo

[[Prototype]]을 순회하면서 Foo.prototype가 가르키는 객체 있는지 조사 계통조사만 가능함으로 2개의 객체가 [[Prototype]] 연쇄를 통해 연결되어 있는지는 전혀 알 수 없다.