JavaScript는 OOP 언어인가요?

黄舟
풀어 주다: 2017-10-21 10:06:40
원래의
1302명이 탐색했습니다.

알아요, 이 주제는 너무 많이 논의됐어요. 그러나 그것은 계속해서 언급됩니다. Java나 C# 또는 기타 OOP 언어 개발자가 JavaScript를 접할 때마다 개발자들은 많은 불평을 합니다. 그들은 JavaScript로 작업하는 것이 완전히 엉망이라고 말합니다. 유형도 없고, 구조도 좋지 않으며, 약간 이상하고, 객체 지원도 좋지 않으며, 확실히 OOP 언어가 아닙니다.

이러한 불만 사항 중 일부는 받아들일 수 있지만 다른 불만 사항은 JavaScript에 유형이 없으므로 OOP 언어가 아니라고 말하는 등 편견이 있습니다. 후자에 관해서는 결론을 내리기 전에 스스로에게 질문해야 합니다. 프로그래밍 언어를 객체 지향 프로그래밍 언어로 만드는 이유는 무엇입니까?

OOP란 무엇인가요?

OOP 패턴에 대한 공식적인 표준 사양은 없습니다. OOP가 무엇인지, 아닌지를 정의하는 기술 문서는 없습니다. OOP 정의는 주로 Kristen Nygaard, Alan Kays, William Cook 등과 같은 초기 연구자들이 발표한 논문의 상식을 기반으로 합니다. 객체 지향은 두 가지 요구 사항을 기반으로 하기 때문에 프로그래밍 언어를 분류하기 위해 OOP와 널리 받아들여지는 정의를 정의하려는 많은 시도가 있었습니다.

  • 객체를 통해 문제를 모델링하는 능력.

  • 모듈화 및 코드 재사용을 허용하는 몇 가지 원칙을 지원합니다.

첫 번째 요구 사항을 충족하려면 언어는 개발자가 객체를 사용하여 현실을 설명하고 객체 간의 관계를 다음과 같이 정의할 수 있도록 해야 합니다.

  • 연관: 객체가 다른 독립 객체를 참조하는 능력 .

  • 집계: 하나 이상의 독립적 개체를 포함하는 개체의 능력입니다.

  • 구성: 하나 이상의 종속 개체를 포함하는 개체의 기능입니다.

일반적으로 언어가 다음 원칙을 지원하면 두 번째 요구 사항이 충족됩니다.

  • 캡슐화: 데이터 및 조작 코드의 단일 엔터티에 집중하고 내부 세부 정보를 숨기는 기능입니다.

  • 상속: 객체가 하나 이상의 다른 객체에서 일부 또는 모든 요소를 ​​얻는 메커니즘입니다.

  • 다형성: 데이터 유형이나 구조에 따라 객체를 다르게 처리하는 능력입니다.

이러한 요구 사항을 충족하는 언어는 일반적으로 객체 지향 언어로 분류됩니다.

JavaScript 및 OOP

이제 우리는 OOP 언어가 어떤 모습인지 알았습니다. 그렇다면 JavaScript가 OOP 언어라는 것을 증명할 수 있을까요? 시도해 봅시다.

우리는 연관, 집계 및 조합을 지원하는 JavaScript 객체의 능력이 강력하지 않다는 것을 알고 있습니다. 다음 코드를 살펴보세요.

var johnSmith = {
 firstName: "John",
 lastName: "Smith",
 address: { //Composition
 street: "123 Duncannon Street",
 city: "London",
 country: "United Kingdom"
 }
};
var nickSmith = {
 firstName: "Nick",
 lastName: "Smith",
 address: { //Composition
 street: "321 Oxford Street",
 city: "London",
 country: "United Kingdom"
 }
};
johnSmith.parent = nickSmith; //Association
var company = {
 name: "ACME Inc.",
 employees: []
};
//Aggregation
company.employees.push(johnSmith);
company.employees.push(nickSmith);
로그인 후 복사

위 코드에서 조합(주소 속성)의 예, 연결(부모 속성)의 예, 집계(직원 속성)의 예를 찾을 수 있습니다.

캡슐화의 경우 JavaScript 개체는 데이터와 기능을 지원하는 엔터티이지만 내부 세부 정보를 숨길 수 있는 높은 수준의 기본 지원은 없습니다. JavaScript 객체는 개인 정보 보호에 관심이 없습니다. 주의하지 않으면 모든 속성과 메서드에 공개적으로 액세스할 수 있습니다. 그러나 객체의 내부 상태를 정의하고 외부 액세스로부터 객체를 보호하기 위해 여러 기술을 적용할 수 있습니다. getter 및 setter를 사용하여 클로저를 활용하세요.

JavaScript는 소위 프로토타입 상속을 통해 기본 수준에서 상속을 지원합니다. 일부 개발자는 다소 단순하다고 생각하지만 JavaScript의 상속 메커니즘은 완전히 유효하며 대부분의 인식된 OOP 언어와 동일한 결과를 얻을 수 있습니다. 여러분이 어떻게 생각하든 JavaScript에는 "객체가 하나 이상의 다른 객체로부터 일부 또는 모든 기능을 얻는" 메커니즘이 있으며 이것이 바로 상속입니다.

다형성에 대한 도전은 많은 사람들이 이 개념을 데이터 유형과 연관시키기 때문에 더 어려운 것 같습니다. 실제로 다형성은 프로그래밍 언어의 여러 측면에 영향을 미치며 OOP 언어에만 관련된 것이 아닙니다. 일반적으로 여기에는 제네릭, 오버로딩 및 구조적 하위 유형과 같은 항목이 포함됩니다. 이 모든 것이 "단순"하고 약한 유형의 언어인 JavaScript에 비해 압도적으로 보입니다. 그러나 사실은 그렇지 않습니다. JavaScript에는 다양한 유형의 다형성을 구현할 수 있는 여러 가지 방법이 있으며 아마도 깨닫지도 못한 채 여러 번 수행했을 것입니다.

클래스 없는 OOP

"좋아요. 하지만 다시 말하지만 JavaScript에는 클래스가 없습니다."

많은 개발자는 JavaScript에 클래스 개념이 부족하다고 믿고 있으며 JavaScript를 진정한 객체 지향 언어로 간주하지 않습니다. OOP 원칙은 시행되지 않습니다.

그러나 비공식 정의에서는 클래스에 대한 명시적인 언급이 없음을 알 수 있습니다. 객체에는 속성과 원리가 필요하다는 것은 사실입니다. 그러나 클래스는 실제로 요구 사항이 아니며 때로는 공통 속성을 가진 개체 집합을 추상화하는 편리한 방법일 뿐입니다. 따라서 언어를 지원하는 개체에 클래스가 없더라도 JavaScript와 같은 개체 지향 언어일 수 있습니다.

또한 OOP 원칙의 목적을 지원하도록 설계되었습니다. 언어로 프로그래밍하기 위해 OOP 원칙이 필수는 아닙니다. 개발자는 객체 지향 코드를 생성할 수 있는 구문을 사용하거나 사용하지 않을 수도 있습니다. 많은 사람들은 개발자가 OOP 원칙을 위반하는 코드를 작성할 수 있기 때문에 JavaScript를 비판합니다. 하지만 이는 언어의 제한이 아닌 프로그래머의 선택일 뿐입니다. 이는 C++와 같은 다른 프로그래밍 언어에서도 발생합니다.

그래서 우리는 추상 클래스가 부족하고 개발자에게 OOP 원칙을 지원하는 기능을 자유롭게 사용하거나 사용하지 않도록 허용하는 것이 JavaScript를 OOP 언어로 식별하는 데 실질적인 장애물이 아니라는 결론을 내릴 수 있습니다

위 내용은 JavaScript는 OOP 언어인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿