JS의 객체 지향 프로그래밍
14306 단어 webprogrammingjavascriptnode
자바스크립트의 상속 모델
JavaScript는 프로토타입 기반 상속 모델을 따릅니다. 프로토타입은 JS 엔진이 함수에 추가할 속성입니다. 이 프로토타입 객체 인턴은 기본적으로 생성자 속성을 가지고 있습니다. 프로토타입에서 사용 가능한 속성을 확인하려면 Object.getOwnPropertyNames(functionName.prototype)를 사용할 수 있습니다.
프로토타입에 어떤 속성이 있는지 확인합니다.
클래스 및 해당 인스턴스 만들기
먼저 JS에서 특정 클래스 객체를 생성하는 방법을 살펴보겠습니다.
객체를 생성하려면 생성자 함수를 사용해야 합니다. 생성자 함수를 사용하여 특정 유형의 객체를 가져올 수 있습니다. new Array(), new Date()에 사용된 new 키워드를 이미 본 적이 있을 것입니다.
다음 경우에는 Transport 유형에 대한 생성자 함수를 생성합니다. 규칙은 클래스의 이름을 지정하는 것처럼 생성자 함수의 이름을 지정하는 것입니다.
function Transport(mode, travelSpeed, ticketCost) {
this.mode = mode
this.travelSpeed = travelSpeed
this.ticketCost = ticketCost
}
let bus = new Transport('Road', 'Slow', 'Cheap')
console.log(bus)
// Output: { mode: "Road", travelSpeed: "Slow", ticketCost: "Cheap" }
그래서 여기에서 Transport 유형의 객체를 생성하는 생성자 함수를 만들었습니다.
'instance of' 연산자를 사용하여 객체가 클래스의 인스턴스인지 확인하려면.
bus instanceof Transport
// Output: true
또한 protype 개체의 속성을 확인할 수도 있습니다.
console.log(Object.getOwnPropertyNames(Transport.prototype))
// Output: Array [ "constructor" ]
클래스에 메소드 추가
클래스로 작업할 때 프로토타입에서 메서드를 사용해야 합니다. 이렇게 하면 프로토타입에서 메서드를 변경할 수 있고 모든 인스턴스에 반영할 수 있기 때문입니다.
Transport.prototype.showInfo = function() {
console.log(this.mode, this.travelSpeed, this.ticketCost)
}
bus.showInfo()
// Output: Road Slow Cheap
이제 Transport의 prototype 속성을 확인하면 방금 추가한 메서드를 볼 수 있습니다.
console.log(Object.getOwnPropertyNames(Transport.prototype))
// Output: Array [ "constructor", "showInfo" ]
자식 클래스 만들기
이제 이 객체는 Transport 클래스에 공통적이지 않은 속성을 가질 것이기 때문에 Bus에 대해 별도의 유형의 클래스를 생성해 보겠습니다.
function Bus(mode, travelSpeed, ticketCost, busType) {
Transport.call(this, mode, travelSpeed, ticketCost)
this.busType = busType
}
let interCityBus = new Bus('Road', 'Slow', 'Cheap', 'Sleeper')
console.log(interCityBus)
// Output: { mode: "Road", travelSpeed: "Slow", ticketCost: "Cheap", busType: "Sleeper" }
위의 예에서는 Bus 생성자 함수 내에서 Transport 생성자 함수를 호출하여 자식-부모 관계를 만들었습니다. Transport.call()은 super() 연산자 호출과 같습니다.
여기서 상속이 완전히 이루어지지는 않았지만 bus 클래스의 protot 속성을 확인해보자.
console.log(Object.getOwnPropertyNames(Bus.prototype))
// Output: Array [ "constructor" ]
여기에는 부모에 정의된 메서드가 없습니다. 부모로부터 속성을 얻으려면
자식 프로토타입과 부모 프로토타입을 병합해야 하는 경우 this MDN post 및 이 게시물 Digital Ocean communiy 에 매우 친절하고 자세하게 설명되어 있습니다. JavaScript의 프로토타입에 대해 자세히 알아보려면 이 게시물( JavaScript Prototype in Plain Language , Prototypes in JavaScript )을 읽으십시오. 또한 자식 클래스의 프로토타입에서 값을 할당하여 자식의 메서드를 재정의할 수 있습니다.
수업으로 작업하는 더 쉬운 방법
프로토타입 작업은 다소 지루하고 혼란스러울 수 있습니다. 상속을 처리하는 또 다른 방법이 있습니다. ES 2105는 클래스를 생성하기 위해 새로운 구문을 도입했습니다. 내부 상속 메커니즘은 동일하게 유지됩니다. 위의 예를 클래스 기반 솔루션으로 변환해 보겠습니다.
class Transport {
constructor(mode, travelSpeed, ticketCost) {
this.mode = mode
this.travelSpeed = travelSpeed
this.ticketCost = ticketCost
}
showInfo() {
console.log(this.mode, this.travelSpeed, this.ticketCost)
}
}
class Bus extends Transport {
constructor(mode, travelSpeed, ticketCost, busType) {
super(mode, travelSpeed, ticketCost)
this.busType = busType
}
}
let cityBus = new Bus('Road', 'Slow', 'Cheap', 'Seating')
cityBus.showInfo()
거기다가 깔끔하고 깨끗해보이지 않나요?
상위 클래스의 생성자에 값을 전달하기 위해 super() 연산자를 사용했습니다. 또한 이 방법을 사용하면 JavaScript에서 처리하므로 부모 클래스와 기본 클래스의 프로토타입을 병합할 필요가 없습니다. showInfo() 메서드의 동작을 변경하려면 자식 클래스에서 간단히 재정의하면 됩니다.
class Bus extends Transport {
constructor(mode, travelSpeed, ticketCost, busType) {
super(mode, travelSpeed, ticketCost)
this.busType = busType
}
showInfo() {
console.log(this.mode, this.travelSpeed, this.ticketCost, this.busType)
}
}
let cityBus = new Bus('Road', 'Slow', 'Cheap', 'Seating')
cityBus.showInfo()
항상 생성자 내부의 모든 속성을 설정할 필요는 없습니다. 때때로 특정 값만 설정하고 읽고 싶을 수도 있습니다. getter 및 setter에 대해 읽을 수 있습니다here.
이 게시물이 마음에 들면 공유하고 내 게시물을 계속 업데이트하려면 저를 팔로우하세요. :)
Unsplash의 Hal Gatewood 표지 사진
Reference
이 문제에 관하여(JS의 객체 지향 프로그래밍), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kartik2406/object-orientated-programming-in-js-hjc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)