제6장 대상을 위한 프로그램 설계(一)

6321 단어
대상 지원(Object-Oriented, OO) 언어에는 클래스 개념이 있다는 표지가 있다.실례화 클래스를 통해 같은 속성과 방법을 가진 여러 개의 대상을 만들 수 있습니다.ECMAScript에는 클래스 개념이 없으므로 클래스 기반 언어의 객체와는 객체가 다릅니다.
  ECMA-262는 대상을'무질서한 속성의 집합으로 그 값은 기본값, 대상 또는 함수를 포함할 수 있다'고 정의했다.따라서 우리는 대상을 하나의 산 목록으로 상상할 수 있다. 여러 개의 무질서한 값을 포함하고, 이름은 속성 이름이나 방법 이름을 대표하며, 값은 데이터나 함수일 수 있다.

1. 객체 작성


ECMAScript에서 사용자 정의 객체를 작성하는 방법은 주로 다음과 같은 네 가지입니다.
  • Object 인스턴스 만들기
  • 글자량
  • 공장 모델
  • 구조함수(원형)
  • 1.1 Object 인스턴스에서 사용자 정의 객체 만들기


    Object 인스턴스를 사용하여 사용자 정의 객체를 작성하는 방법은 앞에서 이미 여러 차례 언급되었으며 다음 예는 다음과 같습니다.
    var person = new Object();
    person.name = "Ivan";
    person.age = 22;
    person.job = "Software Engineer";
    
    person.sayName = function(){
        alert(this.name);
    }
    

    위의 예에서는 먼저 Object 개체를 만든 다음 세 가지 속성과 메서드를 추가했습니다.

    1.2 글꼴로 객체 작성


    다음은 객체의 글꼴을 통해 객체를 작성한 예입니다.
    var person = {
        name: "Ivan",
        age: 22,
        job: "Software Engineer",
        sayName: function(){
            alert(this.name);
        }
    }
    

    위의 예는 명치 쌍을 정의하는 방식으로 세 가지 속성과 한 가지 방법을 가진person 대상을 만들었다.
    ECMAScript의 객체에는 데이터 속성과 액세서리 속성 두 가지 유형의 속성이 있습니다.

    1.2.1 데이터 속성


    데이터 속성에는 동작을 설명하는 4가지 특성이 있습니다.
  • [[Configurable]]: delete를 통해 이 속성을 삭제할 수 있는지, 속성의 특성을 수정할 수 있는지, 또는 속성을 액세서리 속성으로 수정할 수 있는지를 나타낸다.기본값은 true입니다.
  • [[Enumerable]]: for-in 문장을 통해 이 속성을 순환할 수 있는지 여부를 나타낸다.기본값은 true입니다.
  • [[Writable]]: 속성의 값을 수정할 수 있는지 여부를 나타냅니다.기본값은 true입니다.
  • [[Value]]: 이 속성의 값을 포함합니다.속성을 읽을 때 이 위치에서 읽기;속성 값을 쓸 때, 새 값을 이 위치에 쓰십시오.기본값은 undefined입니다.

  • 위에서 정의한 기능은 자바스크립트 엔진을 실현하기 위해 사용되며 자바스크립트는 직접 접근할 수 없습니다.따라서 데이터 속성의 기본 특성을 수정하려면 ECMAScript의 Object를 사용해야 합니다.defineProperty() 방법입니다.이 방법은 세 개의 매개 변수를 수신한다. 그것이 바로 속성이 있는 대상, 속성 이름과 설명자 대상이다.예를 들면 다음과 같습니다.
    var person = {};
    Object.defineProperty(person, "name", {
        writable: false,
        value: "Ivan"
    });
    alert(person.name);  //"Ivan"
    person.name = "Roy";
    alert(person.name);  //"Ivan"
    

    위의 예에서name 속성을 수정할 수 없는 것으로 설정하면 비엄격한 모드에서 수정하려는 작업은 무시됩니다.엄격한 모드에서 수정 작업은 바로 오류를 던진다.

    1.2.2 액세서리 속성


      액세서리 속성은 데이터 값을 포함하지 않습니다. Getter와setter 함수 한 쌍을 포함합니다. (필요하지 않습니다.)액세서리 속성을 읽을 때 Getter 함수를 호출합니다. 이 함수는 유효한 값을 되돌려줍니다.속성 값을 쓸 때 setter 함수를 호출합니다. 이 함수는 데이터를 어떻게 처리하는지 책임집니다.액세서리 속성에는 행동을 설명하는 네 가지 특성도 있습니다.
  • [[Configurable]]: delete를 통해 이 속성을 삭제할 수 있는지, 속성의 특성을 수정할 수 있는지, 또는 데이터 속성으로 수정할 수 있는지를 나타낸다.기본값은 true입니다.
  • [[Enumerable]]: for-in 문장을 통해 이 속성을 순환할 수 있는지 여부를 나타낸다.기본값은 true입니다.
  • [[Get]]: 속성 값을 읽을 때 호출되는 함수입니다.기본값은 undefined입니다.
  • [Set]: 속성 값을 쓸 때 호출되는 함수입니다.기본값은 undefined입니다.

  • 액세서리 속성도 직접 정의할 수 없으며 Object를 통과해야 합니다.defineProperty() 방법으로 정의합니다.다음 예는 다음과 같습니다.
    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 
    

    ECMAScript 5를 사용하는 Object.getOwnPropertyDescriptor () 방법으로 주어진 속성에 대한 설명자를 얻을 수 있습니다.이 방법은 두 개의 매개 변수를 수신합니다. 속성이 있는 대상과 설명자를 읽을 속성 이름입니다.되돌아오는 값은 하나의 대상입니다. 만약 액세서리 속성이라면, 이 대상의 속성은configurable,enumerable,get과 set이 있습니다.데이터 속성이라면, 이 대상의 속성은configurable,enumerable, writable,value가 있습니다.예를 들면 다음과 같습니다.
    var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); alert(descriptor.value);  //2004
    alert(descriptor.configurable);  //false
    

    1.3 플랜트 모드를 사용하여 객체 작성


     Object 구조 함수나 대상의 글씨체 양을 사용하여 대상을 만들 수 있지만 이 두 가지 방식은 뚜렷한 결함이 있다. 같은 인터페이스를 사용하여 많은 대상을 만들면 대량의 중복 코드가 발생한다.이 문제를 해결하기 위해 사람들은 공장 모델의 변체를 사용하기 시작했다.다음 예는 다음과 같습니다.
    function createPerson(name, age, job){
        var person = new Object();
        o.name = name;
        o.age =age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);    
        };
        return person;
    }
    

    위의 createPerson() 함수는 수신된 매개 변수에 따라 필요한 정보를 포함하는 Person 대상을 구축할 수 있습니다.이것은 위에서 언급한 대량의 같은 인용 유형의 대상을 만드는 데 가져오는 중복 코드 문제를 해결했다.그러나 이런 방식으로 만들어진 대상은 대상의 실제 유형을 확정할 수 없다.따라서 JavaScript는 구조 함수를 통해 작성된 사용자 정의 객체 모드를 도입합니다.

    1.4 사용자 정의 구조 함수


    앞에서 언급한 바와 같이 ECMAScript는 함수를 구성하여 특정 유형의 객체를 만들 수 있습니다.예를 들어 앞의 Object() 구조 함수와 같은 원시 구조 함수는 실행할 때 자동으로 실행 환경에 나타난다.또한 사용자 정의 구조 함수를 만들어서 사용자 정의 대상을 만들 수 있다.다음 예는 다음과 같습니다.
    function Person(name, age, job){
        this.name = name;
        this.age =age;
        this.job = job;
        this.sayName = function(){
            alert(this.name);    
        };
    }
    var person = new Person("Ivan", 22, "Software Engineer");
    person.sayName();  //"Ivan"
    

    위에서 Person이라는 함수를 정의했는데, 보통 우리는 함수를 구성하는 알파벳을 대문자로 쓰기로 약속했다.구조 함수는 본질적으로 일반 함수와 다를 것이 없다. (일반 함수를 호출하는 것처럼 구조 함수를 호출할 수 있지만, 이렇게 하면 대상 실례를 만들 수 없다.) 단지 new 키워드를 통해 대상 실례를 만들 수 있을 뿐이다.새 조작부호 뒤에 구조 함수와 실질적으로 ECMAScript는 백엔드에서 다음과 같은 몇 가지 일을 합니다: (1) 새로운 대상을 만듭니다. (2) 구조 함수의 역할 영역을 새 대상에게 부여합니다. (따라서this는 이 새 대상을 가리킵니다.) (3) 구조 함수의 코드를 실행합니다. (새 대상에 속성을 추가합니다) (4 새 대상을 되돌려줍니다.
    사용자 정의 구조 함수를 만드는 것은 그 실례를 특정한 유형으로 표시할 수 있음을 의미하며, 이것이 바로 구조 함수가 공장 모델보다 나은 곳이다.instanceof 조작부호를 통해 특정한 대상이 특정 인용 유형의 실례인지 확인할 수 있습니다.예를 들면 다음과 같습니다.
    alert(person instanceof Object);  //true
    alert(person instanceof Person);  //true
    

    모든 참조 유형은 Object 유형에서 상속되므로 여기에서 person instanceof Object도true로 반환됩니다.
      구조 모델은 사용하기 좋지만 가장 중요한 문제는 모든 방법이 모든 실례에 한 번씩 만들어진다는 것이다.앞에서 말했듯이 함수의 본질은 대상이기 때문에 이런 방식으로 만들어진 모든 대상은sayName이라는 Function 실례를 포함한다.이것은 메모리 낭비를 초래했다.함수의 정의를 구조 함수 외부로 옮기는 것이 해결 방안이다.
    function Person(name, age, job){
        this.name = name;
        this.age =age;
        this.job = job;
        this.sayName = sayName;
    }
    sayName = function(){
            alert(this.name);    
    }
    var person = new Person("Ivan", 22, "Software Engineer");
    person.sayName();  //"Ivan"
    

    위의 예는 Person 대상의sayName 방법을 전역 함수로 가리키기 때문에 모든 Person 실례가 이 Function 대상을 공유합니다.그러나 특정한 인용 유형에 속하는 대량의 방법을 전역 환경에서 정의한다. 한편, 이 방법은 의미적으로 보면 전역적인 방법이 아니라 다른 한편, 이렇게 하면 이 인용 유형의 봉인성을 크게 파괴한다.해결 방안은 원형 모델을 사용하는 것이다.

    좋은 웹페이지 즐겨찾기