🔑객체 생성 방식(리터럴표기, Object 생성자 함수, 생성자 함수)에 따른 ✔생성자 함수와 어떤 프로토타입이 생성되는지에 대한 프로세스와 ✔프로토타입의 생성시점을 중심으로 무슨 차이와 공통점이 있는지 살펴보자.
- 상속과 프로퍼티 검색을 위한 메커니즘 위한 🔑프로토타입 체인에 대해서 알아보고 스코프 체인과 비교해보자!
-리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토타입
-프로토타입의 생성 시점
-객체 생성 방식과 프로토타입의 결정
-프로토타입 체인
리터럴 표기법
에 의해 생성된 객체의 생성자 함수와 프로토타입인스턴스
는 '프로토타입'의 constructor 프로퍼티에 의해 생성자 함수와 연결된다.
- 이때 constructor 프로퍼티가 가리키는 생성자 함수 =
인스턴스
를 생성한 생성자 함수<script> // obj 객체를 생성한 생성자 함수는 Object const obj = new Object(); console.log(obj.constructor === Object); // add 객체를 생성한 생성자 함수는 Function const add = new Function('a','b','return a+b'); console.log(add.constructor === Function); // 생성자 함수 function Person(name) { this.name = name; }; // me 객체를 생성한 생성자 함수는 Person const me = new Person('kim') console.log(me.constructor === Person); // true </script>
객체 리터럴 표기법
에 의해 생성된 객체의 생성자 함수와 프로토타입
- 하지만
리터럴 표기법
에 의한 객체 생성 방식과 같이 명시적으로 new 연산자와 함께 생성자 함수를 호출하여 인스턴스를 생성하지 않는 객체 생성 방식도 있다.<script> // 객체 리터럴 const obj = {}; // obj 객체는 Object 생성자 함수로 생성한 객체가 아닌 객체 리터럴로 생성했지만 console.log(obj.constructor === Object)// true가 나온다.. 띠용?! // 함수 리터럴 const add = function(a,b){return a+b}; // 객체 리터럴 const arr = [1, 2, 3] // 정규 표현식 리터럴 const regexp = /is/ig; </script>
- 위 코드의 obj 객체는 Object 생성자 함수로 생성한 객체가 아닌
객체 리터럴
로 생성된 객체지만 obj 객체는 Object 생성자 함수와 constructor 프로퍼티로연결
되어있다.리터럴 표기법
에 의해 생성된 객체도 프로토타입 존재하지만 이 경우 프로토타입의 constructor 프로퍼티가 가리키는 생성자 함수가 반드시 객체를 생성한 생성자 함수라고 단정할 수 없다.
객체 리터럴
에 의해 생성된 객체는 사실 Object 생성자 함수
로 생성되는거야..🤷♂️?!
-이크마스크립트 사양 내용
1>Object 생성자 함수
- 2번 내용처럼
Object 생성자 함수
에
1.1>인수를 전달하지 않거나 1.2>undefined 또는 null을 인수로 전달하면서 호출하면
2>내부적으로 추상 연산OrdinaryObjectCreate
를 호출해
3> Object.prototype을 프로토타입으로 갖는빈 객체
를 생성한다.<script> // 2번 예시> Object 생성자 함수에 의한 객체 생성 // 인수 전달 x 추상 연산 OrdinaryObjectCreate 호출해 빈 객체 생성 let obj = new Object(); console.log(obj); // {} // 1번 예시> new.target이 undefined나 Object가 아닌 경우 // 인스턴스 -> Foo.prototype -> Object.prototype 순으로 프로토타입 체인 생성하여 // 추상 연산 OrdinaryObjectCreate 호출해 빈 객체 생성 class Foo extends Object(); new Foo(); // Foo{} // 3. 인수가 전달된 경우에 인수를 객체로 변환 // Number 객체 생성 obj = new Object('123'); console.log(obj); // Number {123} // String 객체 생성 obj = new Object('123'); console.log(obj); // String {'123'} </script>
2>
객체 리터럴
평가
객체 리터럴
이 평가될 때는 다음과 같이 추상 연산OrdinaryObjectCreate
를 호출해빈 객체
를 생성하고 프로퍼티를 추가하도록 정의되어있다.
- 1>
Object 생성자 함수
호출과 2>객체 리터럴
의 평가는 추상 연산OrdinaryObjectCreate
를 호출해빈 객체
를 생성하는 점까지는 동일하다. 그러나 new.target의 확인이나 프로퍼티를 추가하는 처리 등의 세부 내용은 다르다.
객체 리터럴
에 의해 생성된 객체는 1>Object 생성자 함수
로 생성한 객체가 아니다❌🙅♂️객체 리터럴 표기법
에 의해 생성된 함수 객체의 생성자 함수와 프로토타입
- 1>
Function 생성자 함수
를 호출하여 생성한 함수는 1.렉시컬 스코프를 만들지 않고 전역 함수인 것처럼 스코프를 생성해 2. 클로저도 만들지 않는다.- 2>
함수 선언문, 표현식
을 평가하여 함수 객체를 생성한 건Function 생성자 함수
가 아니지만객체 리터럴
과 마찬가지로 constructor 프로퍼티를 확인해보면 foo 함수의 생성자 함수는 Functino 생성자 함수라고 나온다😥ㅠㅠ<script> // foo 함수는 Function 생성자 함수로 생성한 함수 객체가 아닌 함수 선언문으로 생성 function foo(){} // constructor 프로퍼티를 통해 확인해보면 // 함수 foo의 생성자 함수는 Function 생성자 함수가.. console.log(foo.constructor === Function);// 역시 true라고 나온다구ㅠㅠㅠ </script>
-리터럴 표기법
에 의해 생성된 객체와 함수가 생성자 함수
를 갖는 쥔짜 이유
-
리터럴 표기법
에 의해 생성된 객체도상속
을 위해 프로토타입이 필요하여 '가상적인'생성자 함수
를 갖기는한다.
프로토타입은 생성자 함수와 '더불어 생성'되며 prototype, constructor 프로퍼티에 의해연결
되어 있기 때문이다.
=> 프로토타입과 생성자 함수는 단독으로 존재할 수 없고 언제나 쌍으로 존재한다.
리터럴 표기법
(객체, 함수, 정규 표현식 리터럴 등)에 의해 생성된 객체는 생성자 함수에 의해 생성된 객체는 아니지만 큰 틀에서 보면리터럴 표기법
으로 생성한 객체도생성자 함수
로 생성한 객체와 본질적인 면에서는 큰 차이는 없다.
<결론>
객체 리터럴
에 의해 생성한 객체와Object 생성자 함수
에 의해 생성한 객체는 생성 과정의 미묘한 차이는 있지만 결국 객체로서 동일한 특성을 갖는다.함수 리터럴
에 의해 생성한 함수와Function 생성자 함수
에 의해 생성한 함수는 생성 과정과 스코프, 클로저 등의 차이(함수는 객체에 비해 차이가 있음)가 있지만 역시 함수로서 동일한 특성을 갖는다.
=> 프로토타입의 constructor 프로퍼티를 통해연결
되어있는 생성자 함수를리터럴 표기법
으로 생성한 객체를 생성한 생성자 함수로 여겨도 큰 무리없다.
-리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토 타입
리터럴 표기법
에 의해 생성된 객체도 생성자 함수와 연결
된다.리터럴 표기법
또는 생성자 함수
에 의해 생성되므로 결국 모든 객체는 생성자 함수와 연결
되어있다.
- 프로토타입은 생성자 함수가 생성되는 시점에 '더불어' 생성된다. 왜냐면 프로토타입과 생성자 함수는 단독으로 존재할 수 없고 항상 '쌍으로 존재'하기 때문이다.
생성자 함수는 1>사용자가 직접 정의한 사용자 정의 생성자 함수
와
2>자바스크립트가 기본 제공하는 빌트인 생성자 함수
로 구분할 수 있다.
1>사용자 정의 생성자 함수
와 2>빌트인 생성자 함수
를 구분해 프로토타입 생성시점
에 대해 이해해보자.
사용자 정의 생성자 함수
와 프로토타입 생성 시점
- 내부 메서드 [[Construct]]를 갖는 함수 객체,
즉 화살표 함수나 ES6 메서드의 축약 표현으로 정의하지 않고
1>일반 함수(선언문, 표현식)으로 정의한 함수 객체는new 연산자와 함께생성자 함수
로서 호출할 수 있다.생성자 함수
로서 호출 할 수 있는 함수, 즉 constructor는 함수 정의가 평가되어 함수 객체를생성하는 시점
에 프로토타입도 더불어 생성된다.<script> // 함수 정의(constructor)가 평가되어 함수 객체를 생성하는 시점에 프로토타입도 더불어 생성된다. console.log(Person.prototype); // {constructor:f} // 생성자 함수 function Person(name) { this.name = name; }; </script>
- 반면
생성자 함수
로서 호출 할 수 없는 함수, non-constructor는 프로터타입이 생성되지 않는다.<script> // 화살표 함수는 non-constructor이다. const Person = (name) => { this.name = name; }; // non-constructor는 프로토타입이 생성되지 않음 console.log(Person.prototype); //undefined </script>
- 함수 선언문(일반 함수)으로 정의된 Person
생성자 함수
는 런타임 이전에 어떤 코드보다 먼저 평가되어 함수 객체가 되고 이때 프로토타입도 더불어 생성된다.- 생성된 프로토타입은 Person 생성자 함수의 prototype 프로퍼티에 바인딩된다.
-Person 생성자 함수와 더불어 생성된 프로토타입 내부.
- 생성된 프로토타입은 오직 constructor 프로퍼티만을 갖는 객체인데 프로토타입도 객체이고 모든 객체는 프로토타입을 가진다.
- 결국 프로토타입도 자신의 프로토타입을 갖는데 생성된 프로토타입의 프로토타입은 Object.prototype이다.
<결론>
=> 이처럼 빌트인 생성자 함수가 아닌
사용자 정의 생성자 함수
는 자신이 평가되어 함수 객체로 생성되는 시점에 프로토타입도 함께 생성되며 생성된 프로토타입의 프로토타입은 언제나 Object.prototype이다.
빌트인 생성자 함수
와 프로토타입 생성 시점
- 2>Object, String, Numeber, Function, Array, RegExp, Date, Promise 등과 같은 빌트인 생성자 함수도 일반 함수와 마찬가지로 빌트인 생성자 함수가 생성되는 시점에 프로토타입이 생성된다.
- 모든
빌트인 생성자 함수
는 🎈전역 객체
가 생성되는 시점에 생성된다. 생성된 프로토타입은 빌트인 생성자 함수의 prototype 프로퍼티에 바인딩된다.
🎈전역객체
- 🎈
전역 객체
는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 생성되는 특수한 객체로
- 클라이언트 사이드 환경(브라우저)에선 window객체로
- 서버 사이드 환경(Node.js)에선 global객체를 의미한다.
전역 객체
다음의 객체들을 프로퍼티로 갖는다. 1>표준 빌트인 객체
(Object, String, Numeber, Function, Array...등)
2> 환경에 따른 호스트 객체(클라이언트 Web API 또는 Node.js의 호스트 API),
3> var 키워드로 선언한 전역 변수와 전역 함수
=> 따라서Math, Reflect, JSON을 제외한표준 빌트인 객체
는 모두생성자 함수
다.<script> window.Object===Object//true </script>
=>
표준 빌트인 객체
인 Object도 전역 객체의 프로퍼터이며 전역 객체가 생성되는 시점에 생성된다.
- 이처럼 객체가 생성되기 이전(런타임 전)에 생성자 함수와 프로토타입은 이미 객체화되어 존재한다.
이후생성자 함수
또는리터럴 표기법
으로 객체를 생성하면 프로토타입은 생성된 객체의 [[Prototype]] 내부 슬롯에 할당되어 생성된 객체는 프로토타입을상속
받는다.
객체 생성 방식
과 프로토타입
의 결정
- 1>
객체리터럴
- 2>
Object 생성자 함수
- 3>
생성자 함수
- Object.create 메서드
- 클래스
- 이처럼 다양한 방식으로 생성된 모든 객체는 각 방식 마다 세부적인 객체 생성 방식의 차이가 있으나
추상 연산OrdinaryObjectCreate
에 의해 생성된다는 공통점이 있다.- 1> 추상 연산
OrdinaryObjectCreate
는 필수적으로 자신이 생성할 객체의 프로토타입을 인수로 전달 받는다. 그리고 자신이 생성할 객체에 추가할 프로퍼티 목록을 옵션으로 전달 할 수 있다.
2> 추상 연산OrdinaryObjectCreate
는 빈 객체를 생성한 후 객체에 추가할 프로퍼티 목록이 인수로 전달된 경우 프로퍼티를 객체에 추가한다.
3> 그리고 인수로 전달받은 프로토타입을 자신이 생성한 객체의 [[Prototype]] 내부 슬롯에 할당한 다음 생성한 객체를 반환한다
즉 프로토타입은 추상 연산OrdinaryObjectCreate
에 전달되는 인수에 의해 결정된다. 이 인수는 객체가 생성되는 시점에 객체 생성 방식에 의해 결정된다.
객체 리터럴
에 의해 생성된 객체의 프로토타입
- 자바스크립트 엔진은 1>
객체 리터럴
을 평가하여 객체를 생성할 때 마다 추상 연산OrdinaryObjectCreate
를 호출한다. 이때 추상 연산OrdinaryObjectCreate
에 전달되는 프로토타입은 Object.prototype로객체 리터럴
에 의해 생성되는 객체의 프로토타입이 Object.prototype라는 뜻이다.
<script> const obj = {x:1}; </script>
- 위
객체 리터럴
이 평가되면 추상 연산OrdinaryObjectCreate
에 의해 다음과 같이 Object 생성자 함수와 Object.prototype과 생성된 객체 사이에연결
이 만들어진다.
- 이처럼
객체 리터럴
에 의해 생성된 obj 객체는 Object.prototype을 프로토타입으로 가지며 이로써 Object.prototype을상속
받는다.<script> const obj = {x:1}; // 객체 리터럴에 의해 생성된 obj 객체는 Object.prototype을 상속받는다. console.log(obj.constructor === Object) // true console.log(obj.hasOwnProperty('x')) // true </script>
- obj 객체는 constructor 프로퍼티와 hasOwnProperty 메서드 등을 소유하진 않지만 자신의 Object.prototype의 constructor 프로퍼티와 hasOwnProperty 메서드를 자신의 자산인 것처럼 자유롭게 사용할 수 있는데 이는 obj 객체가 자신의 Object.prototype 객체를
상속
받았기 때문이다.
생성자 함수
에 의해 생성된 객체의 프로토타입
- 2>
Object 생성자 함수
를 인수 없이 호출하면 빈 객체가 생성된다.
Object 생성자 함수시 객체 리터럴과 마찬가지로 추상 연산OrdinaryObjectCreate
가 호출된다. 이때 추상 연산OrdinaryObjectCreate
에 전달되는 프로토타입은 Object.prototype으로Object 생성자 함수
에 의해 생성되는 객체의 프로토타입 Object.prototype이다.
<script> const obj = new Object(); obj.x =1; // Object 생성자 함수에 의해 생성된 obj 객체는 Object.prototype을 상속받는다. console.log(obj.constructor === Object) // true console.log(obj.hasOwnProperty('x')) // true </script>
- 이처럼 Object 생성자 함수에 의해 생성된 obj 객체는 Object.prototype을 프로토타입으로 갖게 되며, 이로써 Object.prototype을
상속
받는다.
-1>객체 리터럴
과 2>Object 생성자 함수
의 객체 생성 방식 차이
- 1>
객체 리터럴
과 2>Object 생성자 함수
에 의한 객체 생성 방식의 차이는 프로퍼티를 추가하는 방식에 있다.
1>객체 리터럴 방식
은 객체 리터럴 내부에 프로퍼티를 추가하지만 2>Object 생성자 함수 방식
은 일단 빈 객체를 생성한 이후 프로퍼티를 추가해야 한다.
생성자 함수
에 의해 생성된 객체의 프로토타입
- new 연산자와 함께 3>
생성자 함수
를 호출하여 인스턴스를 생성하면 다른 객체 생성 방식과 마찬가지로 추상 연산OrdinaryObjectCreate
가 호출된다. 이때 추상 연산OrdinaryObjectCreate
에 전달되는 프로토타입은 생성자 함수의 prototype 프로퍼티에 바인딩되어 있는 객체이다.- 즉
생성자 함수
에 의해 생성되는 객체의 프로토타입은 생성자 함수의 prototype 프로퍼티에 바인딩 되어있는 객체다.<script> function Person(name) { this.name = name; }; const me = new Person('kim') </script>
- 위 코드가 실행되면 추상 연산
OrdinaryObjectCreate
에 의해 아래처럼 생성자 함수와 생성자 함수의 prototype 프로퍼티에 바인딩되어있는 객체와 new 연산자와 함께 생성된 객체(인스턴스) 사이에연결
이 만들어진다.
- 표준 빌트인 객체인 2>
Object 생성자 함수
와 더불어 생성된 프로토타입은 Object.prototpye은 다양한 빌트인 메서드를 갖고 있다 하지만 3>사용자 정의 생성자 함수 Person
과 더불어 생성된 프로토타입 Person.prototpye의 프로퍼티는 constructor뿐이다.
-프로토타입의 프로터티 추가/삭제?
- 프로토타입 Person.prototpye에 프로퍼티를 추가하여 하위(자식) 객체가
상속
받게하려면 어떻게 해야할까?- 프로토타입은 객체이므로 일반 객체와 같이 프로토타입을 추가/삭제 할 수 있고 이렇게 추가/삭제된 프로퍼티는
🔗프로토타입 체인
에 즉각 반영된다.<script> function Person(name) { this.name = name; }; // 프로토타입 메서드 Person.prototype.sayHello = function() { console.log(`hi! my name is ${this.name}`) }; const me = new Person('kim') const you = new Person('minjae') me.sayHello(); // "hi! my name is kim" you.sayHello(); // "hi! my name is minjae" </script>
- 생성자 함수를 통해 new 연산자와 함께 생성된 모든 객체는프로토타입에 추가된 sayHello 메서드를
상속
받아 자신의 메서드처럼 사용할 수 있다.
- Person 생성자 함수에 의해 생성된 me 객체는 Object.prototype의 메서드인 hasOwnProperty를 호출할 수있는데 이는 me 객체가 Person.prototype뿐만 아니라 Object.prototype도
상속
받았음을 의미한다.<script> function Person(name) { this.name = name; }; // 프로토타입 메서드 Person.prototype.sayHello = function() { console.log(`hi! my name is ${this.name}`) }; const me = new Person('kim') console.log(me.hasOwnProperty('name')) // true </script>
- me 객체의 프로토타입은 Person.prototype이며 Person.prototype에 프로토 타입은 Object.prototpy으로 프로토타입의 프로토타입은 언제나
Object.prototype
이다.<script> Object.getPrototypeOf(me) === Person.prototype; // true Object.getPrototypeOf(Person.prototype) === Object.prototype; // true </script>
- 자바스크립트는
객체의 프로퍼티(메서드 포함)에 접근
하려할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]] 내부 슬롯이 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적을검색
하는데 이를 🔗프로토타입 체인
이라고한다.- 🔗
프로토타입 체인
은 자바스크립트가 객체지향 프로그래밍의상속을 구현하는 메커니즘
이다.<script> // hasOwnProperty는 Object.prototype 메서드 // me 객체는 `🔗프로토타입 체인`을 따라 hasOwnProperty 메서드를 검색해 사용 /** 1. hasOwnProperty메서드를 호출한 me 객체에서 hasOwnProperty 메서드를 검색하고 없으면 프로토타입 체인을 따라, [[Prototype]] 내부 슬롯에 바인딩되어있는 프로토타입(Person.prototype)으로 이동해 hasOwnProperty 메서드 검색한다. 2. Person.prototype에도 hasOwnProperty 메서드가 없으면 프로토타입 체인을 따라 [[Prototype]] 내부 슬롯에 바인딩되어있는 프로토타입(Object.prototype)으로 이동하여 hasOwnProperty 메서드를 검색한다. 3. Object.prototype에는 hasOwnProperty메서드가 존재하므로 자바스크립트 엔진은 Object.prototype.hasOwnProperty메서드를 호출한다. 이때 Object.prototype.hasOwnProperty메서드의 this는 me 객체가 된다. **/ me.hasOwnProperty('name') // true Object.prototype.hasOwnProperty.call(me,'name') // </script>
🔔call
🔔
call 메서드
는 this로 사용할 객체를 전달하면서 함수를 호출한다. 위 코드에서 this로 사용할 me 객체를 전달하면서 Object.prototype.hasOwnProperty 메서드를 호출하였다.
- 프로토타입 체인의 최상위에 위치한 객체는 언제나 Object.prototype이기에 모든 객체는 Object.prototype을
상속
받는다.- Object.prototype을 🔗
프로토타입 체인
의 종점이라한다.<script> console.log(me.foo) ;// Object.prototype에서도 프로퍼티를 검색 X undefined를 반환 </script>
- Object.prototype의 프로토타입 즉 내부슬롯의 [[Prototype]] 값은 null이며 🔗
프로토타입 체인
의 종점인 Object.prototype에서도 프로퍼티를 검색할 수 없는 경우 undefined를 반환한다.<script> me.hasOwnProperty('name') // true </script>
- 우선적으로 1. ⛓
스코프 체인
에서 me식별자를 검색
하는데 me 식별자는 전역에서 선언되어전역 스코프에서 검색
한다.
2. 이후 me 객체의 🔗프로토타입 체인
에서hasOwnProperty 메서드를 검색
한다.
=> ⛓스코프 체인
과 🔗프로토타입 체인
은서로 연관없이 별도로 동작하는 것이 아닌서로 협력하여식별자와 프로퍼티를 검색
하는데 사용된다.
스코프 체인
VS 🔗프로토타입 체인
- 자바스크립트 엔진은 🔗
프로토타입 체인
을 따라프로퍼티/메서드를 검색
한다. 즉객체간의 상속관계
로 이루어진프로토타입의 계층적인 구조
에서객체의 프로퍼티를 검색
하여 🔗프로토타입 체인
은상속과 프로퍼티 검색
을 위한 메커니즘이라 말한다.- 반면 프로퍼티가 아닌
식별자
는 ⛓스코프 체인
에서검색
한다.
자바스크립트 엔진은함수의 중첩관계
로 이루어진스코프의 계층적 구조
에서식별자를 검색
한다. 따라서 ⛓스코프 체인
은식별자 검색을 위한 메커니즘
이라 할수 있다.
객체 리터럴
,Object 생성자 함수
에 의해 생성된 객체의 미묘한 차이
- 프로토타입의 생성 시점은 생성자 함수가 생성되는 시점에 생성된다. 이유는 프로토타입과 생성자 함수는 언제나 쌍으로 존재하기 때문!
- 생성자 함수는 사용자 정의 생성자 함수와 빌트인 생성자 함수로 구분 되는데 두 생성자 함수의 프로토타입의 생성 시점에 차이에 대해서
-사용자 정의 생성자 함수는 자신이 평가되어 함수 객체로 생성되는 시점에 프로토타입도 함께 생성
-빌트인 생성자 함수는 전역 객체(코드가 실행되기 이전 단계에 생성되는 특수한 객체)가 생성되는 시점에 생성되며 프로토타입도 함께 생성된다.
- 객체 생성 방식(1>
객체 리터럴
, 2>Object 생성자 함수
, 3>생성자 함수
)에 따른 세부적인 객체 생성 방식 차이와 공통점 그리고 프로토타입의 결정
- 1>
객체 리터럴
- 객체 리터럴이 평가되면 추상 연산에 의해 Object 생성자 함수와 Object.prototype과 생성된 객체 사이에 연결이 만들어진다.- 2>
Object 생성자 함수
- 인수 없이 호출하면 빈 객체가 생성되고 추상 연산가 호출되어 프로토타입을 전달하여 Object 생성자 함수에 의해 생성된 객체는 프로토타입으로 Object.prototype을 가지며 이를상속
받는다.
-1>객체 리터럴
과 2>Object 생성자 함수
의 차이는 프로퍼티를 추가하는 방식으로 1>객체 리터럴
은 객체 리터럴 내부에 프로퍼티를 추가하지만 2>Object 생성자 함수
는 일단 빈 객체를 생성한 이후 프로퍼티를 추가한다.- 3>
생성자 함수
- 추상 연산에 의해 생성자 함수와 생성자 함수의 prototype 프로퍼티에 바인딩되어있는 객체와 new 연산자와 함께 생성된 객체(인스턴스) 사이에 연결이 만들어진다.
-1>객체 리터럴
& 2>Object 생성자 함수
과 3>생성자 함수
의 차이는
1>객체 리터럴
& 2>Object 생성자 함수
는 다양한 빌트인 메서드를 갖지만
3>사용자 정의 생성자 함수와 함께 생성된 프로토타입의 프로퍼티는 constructor뿐이다. 하지만 사용자 정의 생성자 함수는 프로토타입에 프로퍼티를 추가/삭제하여 자식 객체가 상속 받을 수 있다.
- 🔗
프로토타입 체인
은 객체의 프로퍼티(메서드 포함)에 접근시 자신의 프로토타입의 프로퍼티를 순차적을 검색하는 상속과 프로터리르 위한 메커니즘이고 반면 ⛓스코프 체인
는 함수의 중첩 즉 스코프의 계층적 구조에서 식별자를 검색을 위한 메커니즘으로 이 둘은 협력하여 함께 식별자와 프로퍼티를 검색한다.
- 책 - 모던 자바스크립트 Deep Dive (272p-287p)