JavaScript에서 클래스나 개체를 정의하는 몇 가지 일반적인 방법이 있습니다. 공장 접근 방식
함수 createCar(색상, 문, mpg){
var tempCar = 새 객체;
tempCar.color = 색상;
tempCar.doors = 문;
tempCar.mpg = mpg;
tempCar.showColor = 함수 (){
경고( 이 .color);
};
tempCar를 반환합니다 .
}
var car1 = createCar("빨간색", 4, 23);
var car2 = createCar("파란색", 3, 25);
car1.showColor();
car2.showColor();
특정 유형의 객체를 생성하고 반환할 수 있는 팩토리 함수를 정의했습니다. 보기에는 좋지만 작은 문제가 있습니다. 호출할 때마다 새로운 함수 showColor를 생성해야 합니다. 함수 showColor(){ 경고(this.color); } 팩토리 함수에서 직접 가리키기 tempCar.showColor = 쇼컬러; 이렇게 하면 함수를 반복적으로 생성하는 문제를 방지할 수 있지만 객체 메서드처럼 보이지는 않습니다. 생성자 모드
함수 Car(sColor, iDoors, iMpg){
this .color = sColor;
이 .doors = iDoors;
이 .mpg = iMpg;
이 .showColor = 함수 (){
경고( 이 .color);
};
}
var car1 = new Car("빨간색", 4, 23);
var car2 = new Car("파란색", 3, 25);
car1.showColor();
car2.showColor();
첫 번째 방법과 차이점을 볼 수 있는데 생성자 내부에는 객체가 생성되지 않지만 this 키워드가 사용됩니다. new를 사용하여 생성자를 호출하면 먼저 객체가 생성된 다음 이를 사용하여 액세스됩니다. 이 사용법은 다른 객체지향 언어와 매우 유사하지만, 이 방법은 함수를 반복적으로 생성한다는 이전 방법과 동일한 문제가 있습니다. 구성에 대한 하이브리드 생성자/프로토타입 접근 방식
이 방식은 생성자 방식과 프로토타입 방식을 동시에 사용하는 방식으로, 앞서 생성자 방식에 대해 소개한 바 있다. 함수 자동차(){
}
Car.prototype.color = "빨간색";
Car.prototype.doors = 4;
자동차.프로토타입.mpg = 23;
Car.prototype.showColor = 함수 (){
경고( 이 .color);
};
var car1 = 새로운 자동차();
var car2 = 새로운 자동차();
먼저 생성자 Car를 코드 없이 정의한 후 프로토타입을 통해 속성을 추가합니다. 이점: a. 모든 인스턴스는 showColor에 대한 포인터를 저장하여 반복적으로 함수를 생성하는 문제를 해결합니다. b.instanceof를 사용하여 객체 유형을 확인할 수 있습니다. 경고(자동차1 인스턴스); //참 단점은 다음 코드를 추가합니다.
Car.prototype.drivers = new Array("mike", "sue");
car1.drivers.push("매트");
Alert(car1.drivers); //"mike,sue,matt" 출력
Alert(car2.drivers); //"mike,sue,matt" 출력
드라이버는 Array 객체에 대한 포인터이고 Car의 두 인스턴스는 모두 동일한 배열을 가리킵니다.
다음 혼합 방법을 사용해 보겠습니다. 함수 Car(sColor, iDoors, iMpg){
this .color = sColor;
이 .doors = iDoors;
이 .mpg = iMpg;
this .drivers = new Array("mike", "sue");
}
Car.prototype.showColor = 함수 (){
경고( 이 .color);
};
var car1 = new Car("빨간색", 4, 23);
var car2 = new Car("파란색", 3, 25);
car1.drivers.push("매트");
경고(car1.drivers);
경고(car2.drivers);
이렇게 하면 문제가 없으며, instanceof를 사용할 수도 있습니다. 동적 프로토타이핑
함수 Car(sColor, iDoors, iMpg){
this .color = sColor;
이 .doors = iDoors;
이 .mpg = iMpg;
this .drivers = new Array("mike", "sue");
if ( Car.initialized 유형 == "정의되지 않음"){
Car.prototype.showColor = 함수 (){
경고( 이 .color);
};
자동차.초기화 = true ;
}
}
var car1 = new Car("빨간색", 4, 23);
var car2 = new Car("파란색", 3, 25);
car1.drivers.push("매트");
경고(car1.drivers);
경고(car2.drivers);
이 방법은 제가 가장 좋아하는 방법입니다. 모든 클래스 정의는 다른 언어의 클래스 정의와 매우 유사합니다. 인스턴스를 사용할 수도 있습니다.