웹 프론트/JavaScript

딥다이브 책읽기_생성자함수, 일급객체, 프로토타입

hyuni07 2023. 5. 2. 21:22

17장. 생성자함수로 객체생성하기

1. Object 생성자 함수

new object()

- new연산자와 함께 호출하여 인스턴스를 생성한다.

객체리터럴에 비하면 번거롭지만 프로퍼티 구조가 비슷한 인스턴스를 여러개 만들때 효율적으로 사용할 수 있다.

 

*함수 호출 방식 ★☆

function foo() {
	console.log(this);
}

foo(); //window or global - (일반객체로서 호출) 

const obj = { foo };  //ES6 프로퍼티 축약표현 - { foo: foo }와 같다.
obj.foo();  //obj - (메서드로서 호출) 

const con = new foo();  //con - 생성자함수로서 호출

#1 일반함수로서 호출 : this는 전역객체를 바인딩함.

#2 메서드로서 호출 : 메서드를 호출한 객체(마침표 앞의 객체)

#3 생성자함수로서 호출 : 생성자 함수가 (미래에) 생성할 인스턴스

 

const person = {
	name: 'Lee',
    sayHi: function() {
		console.log(`Hi ${this.name}`);
      },
};

person.sayHi();  //Hi Lee -메서드로써 호출(caller)
console.log(new person.sayHi()); //Hi undefined -생성자함수로서 호출(constructor)
const person = {
	name: 'Lee',
    sayHi() {               //축약표현 - 동작이 달라짐.
		console.log(`Hi ${this.name}`);
      },
};

console.log(new person.sayHi()); //TypeError: person.sayHi is not a constructor

함수객체

모든 함수 객체는 callable이다.

constructor인 함수객체와 non-constructor인 함수객체로 나뉜다.

  • constructor: 함수선언문, 함수표현식, 클래스
  • non-constructor: 메서드(ES6축약표현), 화살표함수
function Person(name) {
  //this = {}  -암묵적으로 빈객체가 만들어지고 this에 바인딩된다.
  
  this.name = name;
  this.sayHi = function() {
    console.log(`Hi! My name is ${this.name}.`);
 };
 
 // return this  -암묵적실행으로 this 리턴한다.

18장. 함수와 일급객체

일급객체의 조건

  1. 무명의 리터럴로 생성할 수 있어 런타임에 생성이 가능하다.
  2. 변수나 자료구조(객체, 배열)등에 저장할 수 있다.
  3. 함수의 매개변수로 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.

즉, 함수를 객체와 동일하게 사용할 수 있고

값을 사용할수 있는 곳에서 {}로 사용되면 함수객체=일급객체라고 볼 수 있다.

 

함수객체(일급객체)는 일반객체와 달리 호출이 가능하고

함수 고유의 프로퍼티([[caller]], [[argument]], [[length]],[[prototype]])를 가지고 있다. (-> console.dir메서드로 확인가능)

 *argument의 값 = argument객체(인수정보를 담은 배열같은 객체)

**argument객체의 length프로퍼티 = 인자의 개수(초과된 인수포함) / 함수객체의 length = 매개변수의 개수

 

__proto__접근자 프로퍼티

내부슬롯 [[Prototype]]  => 상속을 구현하는 프로토타입 객체

이 프로토타입 객체에 __proto__라는 프로퍼티로 간접접근

 

__proto__접근자 프로퍼티는 Object.prototype의 프로퍼티다. 즉 객체가 직접소유하고 있는 프로퍼티가 아니다.

*모든객체는 Object.prototype을 상속하고 있다. 즉 Object.prototype는 모든 객체의 최상위(부모)객체.

따라서 모든 객체는 __proto__를 사용할 수 있는 것이다.

 

*hasOwnProperty메서드  인수로 전달받은 프로퍼티키가 객체고유의 프로퍼티키면 true,

                                                                                          상속받은 프로토타입의 프로퍼티키면 false


19장. 프로토타입

자바스크립트 = 프로토타입 기반의 객체지향 프로그래밍 언어

상속 : 어떤 객체의 프로퍼티 또는 메서드를 다른 객체에서 상속받아 그대로 사용하는 것.

 

프로토타입객체를 만들고, 여러개의 인스턴스가 해당 객체의 메서드를 상속받아 사용함으로써

불필요한 중복생성을 방지하고, 재사용성을 높인다.

 

function Person(name) {
  this.name = name;
//  this.sayHi = function() {
//   console.log(`Hi! My name is ${this.name}.`);
//   };
  Person.prototype.sayHi = function() {
    console.log(`Hi! My name is ${this.name}.`);}
  }
 
 const me = new Person('Lee');
 console.log(me);
 
 me.sayHi();
 
//추가설명을 위한 슈도코드임(실코드x)

const Person = {
	prototype: {construntor: person}
    }