-
자바스크립트 생성자함수, 인스턴스, 함수와 일급객체, 프로퍼티Javascript/모던자바스크립트 Deep Dive 2023. 1. 5. 13:03
p.234
생성자 함수에 의한 객체 생성 : new 연산자로 생성된 객체를 인스턴스 라고 한다.
Object 생성자 함수
// 객체리터럴 방식 var obj = {}; // Object 객체 생성자 함수 방식 const newPerson = new Object(); newPerson.name = "woony" newPerson.age = 26 newPerson.sayHello = function () { console.log(`Hi, I'm ${this.name} ${this.age}.`) } newPerson.sayHello() // Hi, I'm woony 26.
📌 new String 과 문자 리터럴(일반선언)은 뭐가 다를까?
//이외에도 String Number Boolean Function Array Date RegExp Promise 제공 // 궁금증 아래 두개는 뭐가 다를까? const str = new String('lee') // Object const str2 = 'lee' // String //1.str은 객체 str2는 문자열이다. //따라서 str == str2 는 허용되지만 str === str2 는 혀용되지 않는다. str2.length // 3 //2.문자열임에도 불구하고 length메서드를 사용할 수 있는 이유는... //메소드를 사용할 때 String 레퍼객체로 임시적으로 감싼 후 실행했기 때문이다.
🔥생성자함수를 쓰는이유
//이렇게 되면 거의 비슷한 프로퍼티를 가진 객체를 두번 생성해야하기 때문에 비효율적이다. const circle1 = { radius: 5, getDiameter: function () { return 2 * this.radius; } }; console.log(circle1.getDiameter()); // 10 const circle2 = { radius: 10, getDiameter: function () { return 2 * this.radius; } }; console.log(circle1.getDiameter()); // 20
아래와 같이 객체 생성자 함수를 통해서 리팩토링 할 수 있다!
//생성자 함수 function Circle (radius) { // 1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다. // 2. this에 바인딩되어 있는 인스턴스를 초기화한다. this.radius = radius; this.getDiameter = function () { return 2 * this.radius } // 3. 완성된 인스턴스가 바인딩된 this를 암묵적으로 반환된다. // return 값을 주게 되면 생성자 함수의 기본 동작을 회손하기 때문에 // return 문을 반드시 생략한다. } const circle1 = new Circle(5) const circle2 = new Circle(10) console.log(circle1.getDiameter()); //10 console.log(circle2.getDiameter()); //20
내부 메서드 [[call]] [[Construct]]
모든 함수 객체는 내부 메서드 [[Call]] (일반함수로서 호출가능하다는 의미) 을 갖고 있으므로 호출 할 수 있다.
그러나 [[Construct]] (일반함수 또는 생성자 함수로서 호출 가능) 는 가질 수도 있고 아닐 수 도 있다.
constructor : 함수선언문, 함수표현식, 클래스
non-constructor : 메서드(ES6 메서드 축약 표현), 화살표함수
🐣 참고자료
Javascript ES6 메서드 축약 표현
해당 포스팅에서는 자바스크립트의 ES6 메서드 축약표현에 대해 다루었습니다.
velog.io
p.249
함수와 일급객체
다음과 같은 조건을 만족하는 객체를 일급 객체 라 한다.
1. 무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성이 가능하다.
2. 변수나 자료구조(객체,배열) 등 에 저장할 수 있다.
3. 함수의 매개변수에 전달할 수 있다.
4. 함수의 반환값으로 사용할 수 있다.
함수는 객체다. 따라서 함수도 프로퍼티를 가질 수 있다.
function square(num){ return num*num } console.dir(square) //ƒ square(num) console.log(Object.getOwnPropertyDescriptors(square)) //{length: {…}, name: {…}, arguments: {…}, caller: {…}, prototype: {…}}
arguments 프로퍼티 : 유사배열객체(length 프로퍼티를 가진 객체)이며 이터러블이다.
🐣 자바스크립트는 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않는다.
- 따라서 함수 호출 시 매개변수 개수만큼 인수를 전달하지 않아도 에러가 발생하지 않는다.
- 초과된 변수를 모두 버리는 것은 아니며 arguments 객체의 프로퍼티로 보관된다.
이러한 특성으로 인해 "가변인자함수" 를 구현할 때 유용하다.
function sum () { let res = 0; for(let i = 0; i <arguments.length; i++) { res += arguments[i] } return res; } console.log(sum()) // 0 console.log(sum(1,2)) // 3 console.log(sum(1,2,3)) // 6
length 프로퍼티 : 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.
name 프로퍼티 : 함수이름을 나타낸다. ( 함수의 이름과 식별자는 다르다는 것을 주의하자! )
'Javascript > 모던자바스크립트 Deep Dive' 카테고리의 다른 글
자바스크립트 변수의 생명주기, 모듈패턴, var const let 차이 (2) 2023.01.02 자바스크립트 스코프, 스코프체인, 함수레벨스코프 (0) 2023.01.01 자바스크립트 원시 값과 객체, 얕은vs깊은 복사, 함수(재귀, 콜백) (0) 2022.12.31 자바스크립트 제어문, 타입변환, 객체 (0) 2022.12.20 자바스크립트 표현식, 데이터타입, 정적동적타입언어, 삼항조건연산자 (0) 2022.12.19