// jb51.net의 코드
function Person (이름) {
this.Name = 이름;
}
Person.prototype.SayHello = function() {
alert('안녕하세요, ' this.Name)
Person.prototype.SayBye = function() {
alert('Goodbye, ' this.Name);
}
그러나 때로는 작성 및 유지 관리의 편의를 위해 공개 메소드의 선언을 객체에 작성하고 이를 Person.prototype에 할당합니다. 예를 들면 다음과 같습니다.
// jb51.net의 코드
function Person(name) {
this.Name = name;
}
Person.prototype = {
SayHello: function() {
alert('안녕하세요, ' this.Name)
},
SayBye: function() {
alert('안녕하세요, ' this. Name);
}
}
이 메소드를 사용하면 이 클래스에 공개 메소드가 많을 때 이 이름이면 많은 Person 식별자를 유지할 필요가 없습니다. 클래스를 언젠가 변경해야 하는 경우 두 가지 변경 사항만 있습니다. 하나는 함수 선언이고 다른 하나는 프로토타입 앞의 식별자입니다. 전자 메서드를 사용하면 N개의 공용 메서드가 있습니다. 1 식별자는 찾기 및 바꾸기를 사용할 수 있지만 유지 관리가 필요하지만 안정성 측면에서 찾기 및 바꾸기는 일부 오류가 발생할 수 있으므로 유지 관리 비용이 증가합니다.
이 방법은 유지 관리에 편리함을 더해 주지만 클래스의 생성자 속성을 잃는 문제라는 또 다른 숨겨진 문제도 발생시킵니다.
// jb51.net의 코드
function Person1 (이름) {
this.Name = name;
}
Person1.prototype.SayHello = function() {
alert('안녕하세요, ' this.Name); }
Person1.prototype.SayBye = function() {
alert('Goodbye, ' this.Name)
}
// jb51.net의 코드
function Person2(이름) {
this.Name = 이름;
}
Person2.prototype = {
SayHello: function() {
alert('안녕하세요, ' this.Name)
},
SayBye: function() {
alert('안녕, ' this.Name)
}
}
alert(new Person1('Bill').constructor); Alert(new Person2('Steve').constructor);
위의 테스트 코드를 실행하면 Person1의 생성자 속성이 Person1 클래스의 생성자이지만 Person2의 생성자 속성임을 알 수 있습니다. 객체 유형을 결정하기 위해 생성자 속성을 사용해야 할 때 문제가 발생합니다.
따라서 JavaScript 클래스를 작성할 때 객체의 유형을 얻기 위해 생성자 속성을 사용할 필요가 없다면 개인적으로 두 번째 작성 방법을 사용하는 것을 선호하지만 생성자 속성을 사용해야 하는 경우 자신만의 반사 메커니즘을 구현하거나 GetType 함수를 사용하세요. 그러면 첫 번째 작성 방법을 사용해야 합니다.
물론 자체 리플렉션 메커니즘이나 GetType 함수를 구현할 때 생성자 속성에 의존하지 않는 경우 자체 유형을 식별하기 위해 추가 멤버 변수를 유지하는 등 두 가지 작성 방법 모두 허용됩니다. 이미 만들어진 일부 JS 프레임워크를 사용할 수도 있습니다. 일부 프레임워크는 이미 js.class와 같은 클래스 구현을 구현했습니다.