IT박스

JavaScript는 객체 지향입니까?

itboxs 2021. 1. 5. 07:50
반응형

JavaScript는 객체 지향입니까?


JavaScript가 객체 지향 언어인지 아닌지에 대한 몇 가지 질문이있었습니다. "언어에 객체가 있다고해서 OO가되지는 않는다"는 말조차도 마찬가지입니다.

JavaScript는 객체 지향 언어입니까?


IMO (그리고 그것은 단지 의견 일뿐) 객체 지향 언어 주요 특징은 다형성 을 지원한다는 것입니다 . 거의 모든 동적 언어가 그렇게합니다.

다음 특성은 캡슐화 이며 Javascript에서도 매우 쉽습니다.

그러나 많은 사람들의 마음 속에는 언어가 객체 지향이라고 할 수 있는지 여부에 대한 균형을 맞추는 것은 상속 (특히 구현 상속)입니다.

Javascript는 프로토 타이핑을 통해 구현을 상속하는 매우 쉬운 방법을 제공하지만 캡슐화를 희생합니다.

따라서 객체 방향에 대한 기준이 다형성, 캡슐화 및 상속의 고전적인 삼인조 인 경우 Javascript는 통과하지 못합니다.

편집 : "원형 상속이 캡슐화를 희생하는 방법"이라는 추가 질문이 제기됩니다. 프로토 타입이 아닌 접근 방식의 다음 예를 고려하십시오.

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

_value 속성은 캡슐화되며 외부 코드에서 직접 수정할 수 없습니다. 뮤 테이터를 클래스에 추가하여 클래스의 일부인 코드에 의해 완전히 제어되는 방식으로 수정할 수 있습니다. 이제 동일한 클래스에 대한 프로토 타입 접근 방식을 고려하십시오.

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

글쎄요. getValue에 할당 된 함수는 더 이상 _value 범위에 있지 않으므로 액세스 할 수 없습니다. _value를의 속성으로 승격해야 this하지만 클래스에 대해 작성된 코드 제어 외부에서 액세스 할 수있게되므로 캡슐화가 손상됩니다.

그럼에도 불구하고 Javascript가 객체 지향적이라는 의견은 여전히 ​​남아 있습니다. 왜? OOD가 주어 졌기 때문에 Javascript로 구현할 수 있습니다.


짧은 대답은 예입니다. 자세한 내용은:

에서 위키 백과 :

JavaScript는 객체 기반입니다. 객체는 프로토 타입으로 보강 된 연관 배열입니다 (아래 참조). 객체 속성 이름은 연관 배열 키입니다. obj.x = 10 및 obj [ "x"] = 10은 동일하며 점 표기법은 단순히 구문 설탕입니다. 속성 및 해당 값은 런타임에 추가, 변경 또는 삭제할 수 있습니다. 객체의 속성은 for ... in 루프를 통해 열거 할 수도 있습니다.

또한 Javascript를 사용한 OOP에 대한 이 기사 시리즈를 참조하십시오 .


Javascript는 절차 적, 객체 지향 (프로토 타입 기반) 및 함수형 프로그래밍 스타일을 지원하는 다중 패러다임 언어입니다.

다음은 Javascript에서 OO를 수행하는 방법에 대한 기사 입니다.


언어가 객체 지향적이기 위해 Java와 똑같이 동작 할 필요는 없습니다. Javascript의 모든 것은 객체입니다. 어느 정도는 객체 지향으로 널리 간주되지만 여전히 기본 요소를 기반으로하는 C ++ 또는 이전 Java와 비교됩니다. 다형성은 유형에 대해 전혀 신경 쓰지 않기 때문에 Javascript에서 문제가되지 않습니다. 구문에서 직접 지원하지 않는 유일한 핵심 OO 기능은 상속이지만 프로그래머가 프로토 타입을 사용하여 원하는대로 쉽게 구현할 수 있습니다. 여기 에 그러한 예가 하나 있습니다.


예, 아니오.

자바 스크립트는 Douglas Crockford가 말했듯이 " 세계에서 가장 오해받는 프로그래밍 언어 "입니다. 그는 JavaScript가 정확히 무엇인지 읽어 볼 것을 강력히 권장 하는 JavaScript에 대한 훌륭한 기사를 가지고 있습니다 . C ++보다 LISP와 더 많은 공통점이 있습니다.


JavaScript는 객체 지향적이지만 Java, C ++, C # 등과 같은 클래스 기반 객체 지향 언어 가 아닙니다 . 클래스 기반 OOP 언어는 JavaScript와 같은 프로토 타입 기반 언어도 포함하는 더 큰 OOP 언어 제품군의 하위 집합입니다. 그리고 자기.


JavaScript는 프로토 타입 기반 프로그래밍 언어입니다 (아마도 프로토 타입 기반 스크립팅 언어가 더 정확한 정의). 상속이 아닌 복제를 사용합니다. 프로토 타입 기반 프로그래밍 언어는 클래스가없는 객체 지향 프로그래밍 스타일입니다. 객체 지향 프로그래밍 언어는 분류 및 관계에 대한 개발 초점을 장려하는 반면, 프로토 타입 기반 프로그래밍 언어는 먼저 동작에 초점을 맞춘 다음 나중에 분류하도록 권장합니다.

"객체 지향"이라는 용어는 1967 년 Alan Kay에 의해 만들어졌으며 2003 년에

메시징, 로컬 보존 및 보호 및 상태 프로세스의 숨김, 모든 것의 극단적 인 지연 바인딩. (출처)

객체 지향 프로그래밍에서 각 객체는 메시지를 수신하고, 데이터를 처리하고, 다른 객체로 메시지를 보낼 수 있습니다.

객체 지향 언어에는 캡슐화, 모듈화, 다형성 및 상속과 같은 기능이 포함될 수 있지만 필수 사항은 아닙니다. 클래스를 사용하는 객체 지향 프로그래밍 언어를 종종 클래스 기반 프로그래밍 언어라고하지만, 클래스를 객체 지향으로 사용해야하는 것은 결코 아닙니다.

JavaScript는 프로토 타입을 사용하여 메서드 및 상속을 포함한 객체 속성을 정의합니다.

결론 : JavaScript는 객체 지향입니다.


대부분의 객체 지향 언어와 달리 JavaScript (ECMA 262 Edition 4 이전)는 클래스 개념이 아니라 프로토 타입입니다. 따라서 객체 지향이라고 부를지 여부는 실제로 다소 주관적입니다.

@eliben : Wikipedia는 객체 기반 이라고 말합니다 . 그것은 객체 지향과 동일하지 않습니다. 실제로 객체 기반에 대한 기사에서는 객체 지향 언어와 프로토 타입 기반 언어를 구분하여 객체 지향이 아닌 JavaScript를 명시 적으로 호출 합니다.


JavaScript는 객체 지향 웹 앱을 작성하는 데 매우 좋은 언어입니다. 프로토 타이핑을 통한 상속과 속성 및 메서드를 지원하므로 OOP를 지원할 수 있습니다. 다형성, 캡슐화 및 많은 하위 분류 패러다임을 가질 수 있습니다.


이것은 물론 주관적이고 학문적 인 질문입니다. 어떤 사람들은 OO 언어가 클래스와 상속을 구현해야하는지에 대해 논쟁하고 다른 사람들은 삶을 바꾸는 프로그램을 작성합니다. ;-)

(하지만 실제로 OO 언어가 클래스를 구현해야하는 이유는 무엇입니까? 객체 가 핵심 구성 요소 라고 생각 합니다. 객체 를 만들고 사용하는 방법은 또 다른 문제입니다.)


그것은 이다 좋은 스레드. 내가 좋아하는 몇 가지 리소스가 있습니다. 대부분의 사람들은 프로토 타입, jquery 또는 서로 다른 객체 모델을 가진 상위 6 개 libs (mootools, ExtJS, YUI) 중 하나로 시작합니다. 프로토 타입은 대부분의 사람들이 생각하는대로 고전적인 OO를 복제하려고합니다.

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

제가 많이 참조하는 프로토 타입과 기능의 사진입니다.

http://www.mollypages.org/misc/js.mp ?


나는 다른 각도에서 튀어 나온이 질문에 대답하고 있습니다.

이것은 영원한 주제이며 많은 포럼에서 화염 전쟁을 열 수 있습니다.

When people assert that JavaScript is an OO programming language because they can use OOD with this, then I ask: Why is not C an OO programming language? Repeat, you can use OOD with C and if you said that C is an OO programming language everybody will said you that you are crazy.

We could put here a lot of references about this topic in very old books and forums, because this topic is older than the Internet :)

JavaScript has not changed for many years, but new programmers want to show JavaScript is an OO programming language. Why? JavaScript is a powerful language, but is not an OO programming language.

An OO programming language must have objects, method, property, classes, encapsulation, aggregation, inheritance and polymorphism. You could implement all this points, but JavaScript has not them.

An very illustrate example: In chapter 6 of "Object-Oriented JavaScript" describe 10 manners to implement "inheritance". How many manners there are in Java? One, and in C++? One, and in Delphi (Object Pascal)? One, and in Objective-C? One.

Why is this different? Because Java, C++, Delphi and Objective-C are designed with OOP in mind, but not JavaScript.

When I was a student (in 1993), in university, there was a typical home work: Implement a program designed using a OOD (Object-oriented design) with a non-OO language. In those times, the language selected was C (not C++). The objective of this practices was to make clear the difference between OOD and OOP, and could differentiate between OOP and non-OOP languages.

Anyway, it is evidence that not all people have some opinion about this topic :)

Anyway, in my opinion, JavaScript is a powerful language and the future in the client side layer!


Hanselminutes episode 146 looks at OO Ajax. It was a good show and definitely a good show to help form an opinion.


Misko Hevery did an excellent introductory Google Tech Talk where he talks about objects in Javascript. I've found this to be a good starting point for people either questioning the use of objects in Javascript, or wanting to get started with them:


The Microsoft Ajax Client Library makes it simple to implement OO in javascript. It supports inharitence, and interface implementation.


I think a lot of people answer this question "no" because JavaScript does not implement classes, in the traditional OO sense. Unfortunately (IMHO), that is coming in ECMAScript 4. Until then, viva la prototype! :-)


I think when you can follow the same or similar design patterns as a true OO language like Java/C#, you can pretty much call it an OO language. Some aspects are obviously different but you can still use very well established OO design pattersn.


JavaScript is Object-Based, not Object-Oriented. The difference is that Object-Based languages don't support proper inheritance, whereas Object-Oriented ones do.

There is a way to achieve 'normal' inheritance in JavaScript (Reference here), but the basic model is based on prototyping.


Everything in javascript is an object - classes are objects, functions are objects, numbers are objects, objects objects objects. It's not as strict about typing as other languages, but it's definitely possible to write OOP JS.


Javascript is not an object oriented language as typically considered, mainly due to lack of true inheritance, DUCK typing allows for a semi-true form of inheritance/polymorphism along with the Object.prototype allowing for complex function sharing. At its heart however the lack of inheritance leads to a weak polymorphism to take place since the DUCK typing will insist some object with the same attribute names are an instance of an Object which they were not intended to be used as. Thus adding attributes to random object transforms their type's base in a manner of speaking.


Technically it is a prototype language, but it's easy to to OO in it.


It is object oriented, but not based on classes, it's based on prototypes.


Yes, it is. However, it doesn't support all of the features one would expect in an object oriented programming language lacking inheritance and polymorphism. This doesn't mean, however, that you cannot simulate these capabilities through the prototyping system that is avaialble to the language.


Objects in JavaScript inherit directly from objects. What can be more object oriented?


For me personally the main attraction of OOP programming is the ability to have self-contained classes with unexposed (private) inner workings.

What confuses me to no end in Javascript is that you can't even use function names, because you run the risk of having that same function name somewhere else in any of the external libraries that you're using.

Even though some very smart people have found workarounds for this, isn't it weird that Javascript in its purest form requires you to create code that is highly unreadable?

The beauty of OOP is that you can spend your time thinking about your app's logic, without having to worry about syntax.


Is JavaScript object-oriented?

Answer : Yes

It has objects which can contain data and methods that act upon that data. Objects can contain other objects.

  • It does not have classes, but it does have constructors which do what classes do, including acting as containers for class variables and methods.
  • It does not have class-oriented inheritance, but it does have prototype-oriented inheritance.

The two main ways of building up object systems are by inheritance (is-a) and by aggregation (has-a). JavaScript does both, but its dynamic nature allows it to excel at aggregation.

Some argue that JavaScript is not truly object oriented because it does not provide information hiding. That is, objects cannot have private variables and private methods: All members are public.

But it turns out that JavaScript objects can have private variables and private methods. (Click here now to find out how.) Of course, few understand this because JavaScript is the world's most misunderstood programming language.

Some argue that JavaScript is not truly object oriented because it does not provide inheritance. But it turns out that JavaScript supports not only classical inheritance, but other code reuse patterns as well.

Sources : http://javascript.crockford.com/javascript.html


I would say it has capabilities to seem OO. Especially if you take advantage of it's ability to create methods on an existing object (anonymous methods in some languages). Client script libraries like jquery (jquery.com) or prototype (prototypejs.org) are good examples of libraries taking advantage of this, making javascript behave pretty OO-like.

ReferenceURL : https://stackoverflow.com/questions/107464/is-javascript-object-oriented

반응형