Dev-dotoli TIL

JS 25 constructor



JS는 Prototype-based programming 카테고리에 속해있음

전통적인 함수형 언어+객체지향

기존의 객체지향언어에 익숙한 개발자는 혼란스러울 수 있음

이런 특징은 JS를 어중간한 언어로 보이게 할 수 있겟지만

이런면이 지금 가장 대중적인 언어로 JS를 꼽는 이유라고 생각함

  • Prototype-based programming
    prototype(원형) 기반 언어
    JS의 모든 객체는 부모역할의 객체와 연결되어있음
    객체 지향의 상속개념과 같이 부모객체의 property나
    method를 상속받아 사용할 수 있음
    이런 부모객체 = Prototype


  • constructor
    con(함께) + struct(쌓다) + or(사람)
    건설업자, programming에서 생성자

  • property
    proper(자신, 적절한,알맞게) + ty(명사)
    고유한 특성, 소유물, 재산

  • method
    meta(추구,탐구) + hodos(길) [greek]
    방법, 방식, 순서, 질서



Constructor & New

demo28.html


객체 생성


{ } : 중괄호로 object 생성

  • 객체 리터럴 / object literal ?

    const variablename = { key1: value1, key2: value2 };
    
const person = {};
//객체를 생성하고

person.name = "dotoli";
//name이라는 property에 "dotoli"를 담음

person.introduce = function () {
  return "My name is " + this.name;
};
//introduce라는 property에 함수를 담음
//함수를 담으면 method

document.write(person.introduce());
// : My name is dotoli

//실행했을 때 this는
//this가 속한 함수, 그 함수가 속한 객체 = person
//this.name = person.name = "dotoli"

객체를 만드는 과정이 분산되어있음
코드의 집중도를 올리려면

const person = {
  name: "dotoli",

  introduce: function () {
    return "My name is " + this.name;
  },
};

document.write(person.introduce());
// : My name is dotoli

여러 사람에 대한 정보를 담으려면?

const person1 = {
  name: "dotoli",
  introduce: function () {
    return "My name is " + this.name;
  },
};

const person2 = {
  name: "zzphoo",
  introduce: function () {
    return "My name is " + this.name;
  },
};

//name은 구체적인 data를 정의하는 것이기때문에
//중복이라고 하기 애매하지만
//introduce method가 중복
//introduce method를 수정하려면 방대한 반복작업이 필요함

code의 중복 = 유지보수 어려워짐
programer로서 반드시 피해야 함



Constructor 생성자


constructor?

‘객체를 만드는 역할’을 하는 함수

JS에서 함수는 재사용 가능한 logic의 묶음뿐 아니라

객체를 만드는 창조자 이기도 함

function Person() {}

const p = new Person();
//new : 객체 생성자

p.name = "dotoli";
p.introduce = function () {
  return "My name is " + this.name;
};

document.write(p.introduce());
// : My name is dotoli
  • 중요 : 함수에 new를 붙이면 return값이 객체가 됨


여러사람에 대한 정보를

새로배운 생성자로 담아보면?

function Person() {}
var p1 = new Person();
p1.name = "dotoli";
p1.introduce = function () {
  return "My name is " + this.name;
};

document.write(p1.introduce() + "<br />");

var p2 = new Person();
p2.name = "zzphoo";
p2.introduce = function () {
  return "My name is " + this.name;
};

document.write(p2.introduce());

//생성자로 만들었지만 개선된 점이 없음
function Person(name) {
  this.name = name;
  this.introduce = function () {
    return "My name is " + this.name;
  };
}
//함수를 먼저 정의하고

const p1 = new Person("dotoli");
const p2 = new Person("zzphoo");
// new를 붙여서 함수를 생성자로 사용

console.log(p1.introduce());
console.log(p2.introduce());
// : My name is dotoli
// : My name is zzphoo
// document.write issue concole.log사용

// introduce method가 중복되지 않음


객체에 대한 초기화

초기화?

어떤 property, method를 가질지

생성자 함수 안에 기술하는 것을 통해서

그 객체가 가지고 있는 정보 / 하는 일을 ‘세팅’하는 행위

  • init
    initialize : 초기화


plus


생성자함주는 일반 함수와 구분하기 위해
첫글자를 대문자로 표시할 것


JS 생성자의 특징?

일반적인 객체지향 언어에서 생성자는 class 소속이지만
JS에서 객체를 만드는 주체는 함수임
함수에 new를 붙여 객체를 만들 수 있다는 점은
JS에서 함수의 위상을 암시하는 단서이며
JS가 추구하는 자유로움을 보여주는 사례




references