JavaScript에서 클래스를 사용하여 객체 지향 프로그래밍을 구현할 수 있습니다. 그러나 JavaScript의 클래스는 Java의 클래스와 다르며 해당 정의 및 용도도 다릅니다.
JavaScript의 클래스 정의
JavaScript에서 동일한 프로토 타입 객체 (프로토 타입)에서 파생 된 모든 객체는 클래스를 형성합니다. 즉, JavaScript의 클래스는 객체 컬렉션의 개념입니다. 두 객체가 동일한 프로토 타입을 갖는 경우 동일한 클래스에 속합니다. JavaScript의 클래스에는 클래스 이름이 필요하지 않습니다. 다음 코드는 예입니다.
코드 사본은 다음과 같습니다.
var p = {x : 42};
var a = object.create (p);
var b = object.create (p);
console.log (a === b); // false
Console.log (Object.getPrototypof (a) === Object.getPrototypo (b)); // true
위의 예에서 객체 A와 B는 동일한 프로토 타입 객체 (프로토 타입) P를 가지므로 A와 B는 동일한 클래스에 속하며 (이 클래스 중 어느 것도 클래스 이름을 갖지는 않지만) 프로토 타입 객체 p에서 42의 값으로 속성 X를 상속합니다.
이 예에서 프로토 타입 객체의 함수가 템플릿과 동일하며 여러 객체가 이에 의해 도출/생성 될 수 있음을 알 수 있습니다. 그 상태는 Java 언어의 클래스 코드와 동일하며 JavaScript의 클래스 정의의 핵심입니다. 다음 예제의 프로토 타입 객체는 클래스 코드와 비슷합니다.
코드 사본은 다음과 같습니다.
var p = {
increment_by : 1,
증분 : 함수 (x) {
x + this.increment_by를 반환합니다.
}
}
var a = object.create (p);
var b = object.create (p);
Console.log (a.increment (7)); // 8
Console.log (B.increment (9)); // 10
위의 예에서, 프로토 타입 객체 P는 값이 1이고 증착이라는 함수를 갖는 속성 (excrement_by)을 정의합니다. 객체 a와 b 템플릿 p에서 ycrement_by 및 증분 함수를 얻습니다. 객체 a 또는 b의 증분 함수를 호출 할 때 JavaScript는 a 또는 b의 excrement_by 값을 얻으려고합니다 (this.increment_by); excrement_by는 p에서 얻어 지므로 값은 모두 Java의 정적 클래스 변수와 유사한 동일한 값을 가진 1- 변수입니다. 따라서 위의 예에서는 excrement_by 변수의 이름을 지정할 때 모든 자본 문자가 사용됩니다.
위의 예에서, 템플릿 P (동일한 클래스에 속하는 객체)에서 생성 된 모든 객체는 동일한 속성과 동작을 갖습니다. 그러나 실제로 동일한 클래스의 다른 객체의 경우 클래스에서 정의 된 속성/행동을 가질뿐만 아니라 종종 몇 가지 독특한 속성과 행동이 있습니다. 따라서 프로토 타입 템플릿을 클래스로 사용해야하는 경우 파생 된 각 객체를 사용자 정의해야합니다.
코드 사본은 다음과 같습니다.
var p = {
increment_by : 1,
증분 : 함수 (x) {
x + this.increment_by + this.custom_increment_by;
}
}
var a = object.create (p);
var b = object.create (p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
Console.log (a.increment (7)); // 8
Console.log (B.increment (9)); // 11
이 예에서 템플릿 P에서 생성 된 오브젝트 A와 B에는 값이 반드시 서로 동일하지 않은 변수 custom_increment_by가 있으며, 증분 () 함수 동작의 최종 결과는 custom_increment_by의 값과 관련이 있습니다. 일반적으로, 새로운 개체를 사용자 정의하는 작업은 종종 통일 된 기능으로 수행됩니다.
코드 사본은 다음과 같습니다.
var p = {
increment_by : 1,
증분 : 함수 (x) {
x + this.increment_by + this.custom_increment_by;
}
}
함수 getIncrementalClassObject (CustomInCrementBalue) {
var excrementalobj = object.create (p);
incrementalobj.custom_increment_by = customIncrementBalue;
리턴 증분 알 로즈;
}
var a = getIncrementalClassObject (0);
var b = getIncrementalClassObject (1);
Console.log (a.increment (7)); // 8
Console.log (B.increment (9)); // 11
이러한 방식으로, 클래스 정의는 프로토 타입 객체 P 및 getIncrementalClassObject () 함수를 통해 완료됩니다. 프로토 타입 객체가 P 인 프로토 타입 객체는 getIncrementalClassObject () 함수를 호출하여 얻을 수 있으며, 이러한 새로운 객체는 GetIncrementalSobject () 함수에 대한 호출 중에 특정 정도로 사용자 정의 할 수 있습니다. 이 정의 된 클래스에는 현재 클래스 이름이 없다는 점에 주목할 가치가 있습니다. 설명을 위해서는 증분이라고합니다.
getIncrementalClassObject () 함수에서 수행 된 작업을 되돌아 보면 증분 클래스에서 새 개체를 만드는 프로세스가 다음과 같습니다.
1. 빈 객체를 만들고 프로토 타입 객체를 p로 정의하십시오.
2. 다른 매개 변수 값에 따라 새로 생성 된 빈 객체를 사용자 정의하십시오.
3. 사용자 정의 된 새 개체를 반환하십시오.
JavaScript에서는 생성자를 사용하여 클래스의 정의와 새 개체 생성을 신속하게 완료 할 수 있습니다.
JavaScript의 생성자 (생성자)
위의 증분 클래스의 예에서 새 클래스를 정의하려면 코드의 두 부분이 필요하다는 것을 알 수 있습니다. 템플릿으로 프로토 타입 객체를 작성하고 새 개체를 초기화하기위한 사용자 정의 함수를 만듭니다. 클래스에서 새 객체를 만드는 것은 새로운 객체의 프로토 타입 객체를 지정하고 새 개체를 사용자 정의/초기화 하며이 새 개체를 반환합니다. JavaScript 에서이 모든 것은 생성자 (생성자)를 통해 수행 할 수 있습니다.
JavaScript의 생성자는 새 개체를 초기화하는 책임을 가정하는 함수입니다. 이 생성자 함수의 프로토 타입은 새 개체를 생성하기위한 템플릿으로 사용됩니다. 위의 증분 클래스를 예로 들어, 생성자를 사용하여 코드를 다시 작성 한 후에는 다음과 같습니다.
코드 사본은 다음과 같습니다.
함수 증분 (CustomInCrementBalue) {
this.custom_increment_by = CustomInCrementBalue;
}
증분 .prototype = {
increment_by : 1,
증분 : 함수 (x) {
x + this.increment_by + this.custom_increment_by;
}
}
var a = 새로운 증분 (0);
var b = 새로운 증분 (1);
Console.log (a.increment (7)); // 8
Console.log (B.increment (9)); // 11
새 키워드를 통해 생성자 함수를 사용하여 새 개체를 만드는 프로세스는 실제로 다음 단계를 거칩니다.
새 빈 개체를 만듭니다.
1.이 객체의 프로토 타입 객체를 생성자 함수의 프로토 타입 속성에 가리 킵니다.
2.이 객체를이 매개 변수로 사용하고 생성자 함수를 실행하십시오.
3. 이것은 getIncrementalClassObject () 함수에서 수행 된 이전 작업과 동일합니다.
클래스 이름
생성자를 사용하여 객체를 생성 할 때 해당 객체에는 "클래스 이름"이 있으며, 이는 인스턴스 연산자의 결과에서 확인할 수 있습니다.
코드 사본은 다음과 같습니다.
Console.log (인스턴스 증분); // true
console.log (b 인스턴스 증분); // true
그러나 연산자 인스턴스는 객체가 증분 생성자에 의해 생성되는지 여부를 결정하지 않습니다. 연산자의 인스턴스는 객체의 프로토 타입 객체가 증분인지 여부 만 결정합니다. 동일한 프로토 타입을 가진 두 개의 생성자가 있으면 인스턴스 연산자는 객체를 생성하는 데 사용되는 생성자를 구별하지 않고 균일하게 균일하게 반환합니다.
코드 사본은 다음과 같습니다.
함수 ycremental2 (customInCrementBalue) {
this.custom_increment_by = CustomInCrementBalue + 3;
}
증분 2.prototype = ycemental.prototype;
console.log (incastof ycental2); // true