-
Notifications
You must be signed in to change notification settings - Fork 0
05.Prototypes_1.md
original document link : https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md
3 장과 4 장에서는 [Prototype] 체인을 여러 번 언급했지만 정확히 무엇인지는 말하지 않았습니다. 이제 프로토 타입을 자세히 살펴 보겠습니다.
자바 스크립트의 객체는 [[Prototype]]으로 명세 된 내부 속성을 가지며, 이는 단순히 다른 객체에 대한 참조입니다. 거의 모든 객체는 생성 당시이 속성에 대해 null이 아닌 값이 제공됩니다.
var myObject = {
a: 2
};
myObject.a; // 2[[Prototype]] 참조는 무엇을 위해 사용됩니까? 3 장에서는 객체의 속성 (예 : myObject.a)을 참조 할 때 호출되는 [[Get]] 작업에 대해 살펴 보았습니다. 기본 [[Get]] 연산의 경우, 첫 번째 단계는 객체 자체에 속성이 있는지 확인하는 것입니다. 그렇다면 해당 객체가 사용됩니다.
.
그러나 myObject에 a가 없으면 객체의 [[Prototype]] 링크에 주의를 기울여야합니다.
var anotherObject = {
a: 2
};
// create an object linked to `anotherObject`
var myObject = Object.create( anotherObject );
myObject.a; // 2.
그래서 이제 [[Prototype]]이 anotherObject에 링크 된 myObject를 가지고 있습니다. 분명히 myObject.a는 실제로 존재하지 않지만 그럼에도 불구하고 속성 액세스가 성공하고 (대신 anotherObject에서 찾음) 실제로 값 2를 찾습니다.
그러나 anotherObject에서도 a가 발견되지 않고, [[Prototype]] 체인이 비어 있지 않은 경우, 같은 방법으로 a를 찾아갑니다.
이 프로세스는 일치하는 속성 이름이 발견되거나 [[Prototype]] 체인이 끝날 때까지 계속됩니다. 체인 끝에 일치하는 속성이 없는 경우 [[Get]] 작업의 반환 결과는 정의되지 않습니다.
이 [[Prototype]] 체인의 룩업 프로세스와 마찬가지로 for..in 루프를 사용하여 객체를 반복 할 경우 체인을 통해 도달 할 수있는 모든 속성이 사용될 것입니다. in 연산자를 사용하여 객체에 대한 속성의 존재 여부를 테스트하면 in은 열거 가능 여부와 상관없이 객체의 전체 체인을 검사합니다.
var anotherObject = {
a: 2
};
// create an object linked to `anotherObject`
var myObject = Object.create( anotherObject );
for (var k in myObject) {
console.log("found: " + k);
}
// found: a
("a" in myObject); // true
console.log(myObject.__proto__)
// Object {a: 2, b: 2, c: 2}[[Prototype]] 체인은 여러 가지 방법으로 속성 조회를 수행 할 때 한 번에 하나씩 링크됩니다. 속성이 발견되거나 체인이 끝나면 조회가 중지됩니다.
.
[[Prototype]] 체인은 정확히 어디에서 끝나나요?
모든 일반 [[Prototype]] 체인의 최상단은 기본 제공되는 Object.prototype입니다. 이 객체에는 JS에서 사용 된 다양한 공용 유틸리티가 포함되어 있습니다. JavaScript의 모든 기본 객체는 Object.prototype 객체를 상속 받습니다.
여기에서 언급된 익숙한 유틸리티는 .toString() 및 .valueOf()를 포함합니다. 3장에서는 .hasOwnProperty(..)를 소개했었습니다. 그리고 아직 익숙하지 않은 Object.prototype에 대한 또 다른 함수가 있습니다(isPrototypeOf(..) 같은...)
.
.
.
.