제6장 대상을 위한 프로그램 설계(一)
ECMA-262는 대상을'무질서한 속성의 집합으로 그 값은 기본값, 대상 또는 함수를 포함할 수 있다'고 정의했다.따라서 우리는 대상을 하나의 산 목록으로 상상할 수 있다. 여러 개의 무질서한 값을 포함하고, 이름은 속성 이름이나 방법 이름을 대표하며, 값은 데이터나 함수일 수 있다.
1. 객체 작성
ECMAScript에서 사용자 정의 객체를 작성하는 방법은 주로 다음과 같은 네 가지입니다.
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가지 특성이 있습니다.
위에서 정의한 기능은 자바스크립트 엔진을 실현하기 위해 사용되며 자바스크립트는 직접 접근할 수 없습니다.따라서 데이터 속성의 기본 특성을 수정하려면 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 함수를 호출합니다. 이 함수는 데이터를 어떻게 처리하는지 책임집니다.액세서리 속성에는 행동을 설명하는 네 가지 특성도 있습니다.
액세서리 속성도 직접 정의할 수 없으며 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 대상을 공유합니다.그러나 특정한 인용 유형에 속하는 대량의 방법을 전역 환경에서 정의한다. 한편, 이 방법은 의미적으로 보면 전역적인 방법이 아니라 다른 한편, 이렇게 하면 이 인용 유형의 봉인성을 크게 파괴한다.해결 방안은 원형 모델을 사용하는 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.