자바스크립트 프로퍼티

6. 객체 지향 프로그래밍

  • ECMAScript에는 클래스라는 개념이 없으며 ECMAScript의 객체는 다른 클래스 기반 언어와 다름
  • ECMA-262는 객체를 “프로퍼티의 순서 없는 컬렉션이며 각 프로퍼티는 원시 값이나 객체 함수를 포함한다”라고 정의
  • 객체가 특별한 순서가 없는 값의 배열
  • 각 프로퍼티와 메서드는 이름으로 구별, 값에 대응
  • 해시테이블 , 이름-값 쌍의 그룹이며 각 값은 데이터나 함수가 될 수 있음
  • 모든 객체는 참조 타입을 바탕으로 생성

프로퍼티 타임

1. 데이터 프로퍼티

[[Configurable]]
  • default: true
  • delete를 통해 삭제, 프로퍼티 속성 변경, 접근자 프로퍼티로 변환 여부
  • false로 설정하면 다시는 수정할 수 없음
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var person = {};
    Object.defineProperties(person, "name", {
    configurable: false,
    value: "Nicholas"
    });

    alert(person.name); // Nicholas
    delete person.name;
    alert(person.name); // Nicholas

    Object.defineProperties(person, "name", {
    configurable: true,
    value: "Nicholas"
    });
    // 에러 발생
[[Enumerable]]
  • default: true
  • for-in 루프에서 해당 프로퍼티를 반환 여부
[[Writable]]
  • default: true
  • 프로퍼티의 값을 바꿀 수 있음
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var person = {};
    Object.defineProperties(person, "name", {
    writable: false,
    value: "Nicholas"
    });

    alert(person.name); // Nicholas
    person.name = "Greg";
    alert(person.name); // Nicholas
[[Value]]
  • default: undefined
  • 프로퍼티의 실제 데이터 값을 포함

접근자 프로퍼티

  • 데이터 값이 들어 있지 않고 getter, setter 함수로 구성
  • 접근자 프로퍼티를 명시적으로 정의할 수는 없음
  • 반드시 Object.definedProperty()를 사용, 지원하지 않는 경우 [[Configurable]] [[Enumerable]]을 수정할 수 없음
  • 이전 버전 –defineGetter. __defineSetter
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var book = {
    _year: 2004,
    edition: 1
    }

    Object.defineProperty(book, "year", {
    get: function(){
    return this._year;
    },
    set: function(newValue) {
    if(newValue > 2004){
    this._year = newValue;
    this.edition += newValue - 2004;
    }
    }
    });

    book.year = 2005;
    alert(book.edition); //2

프로토타입 패턴

  • 모든 함수는 prototype 프로퍼티를 가짐
  • 프로토타입의 프로퍼티와 메서드는 객체 인스턴스 전체에서 공유됨

reference

  • 프론트엔드 개발자를 위한 자바스크립트 프로그래밍