JavaScript에 클래스가 있습니까?
지난주에 친구와 다툼이있었습니다. 그는 JavaScript에는 클래스와 같은 것이 없다고 말했습니다.
나는 당신이 말할 수있는대로 있다고 말했다 var object = new Object()
그는 " class
사용 된 단어가 없기 때문에 수업이 아닙니다." 라고 말합니다 .
누구가 맞습니까?
참고로; 미래를 위해 간결한 Classy JS 구현이 필요합니다.
https://github.com/tnhu/jsface
편집 : 2017 년 7 월
ECMAScript 2015에 도입 된 JavaScript 클래스는 주로 JavaScript의 기존 프로토 타입 기반 상속에 대한 구문 적 설탕입니다. 클래스 구문은 JavaScript에 새로운 객체 지향 상속 모델을 도입하지 않습니다. JavaScript 클래스는 객체를 생성하고 상속을 처리하기 위해 훨씬 간단하고 명확한 구문을 제공합니다.
-Mozilla ES6 클래스 : https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes
기술적으로 "JavaScript에는 클래스가 없습니다"라는 문장이 정확합니다.
JavaScript는 객체 지향 언어이지만 클래스 기반 언어 가 아니라 프로토 타입 기반 언어 입니다. 이 두 접근 방식에는 차이가 있지만 JavaScript를 클래스 기반 언어처럼 사용할 수 있기 때문에 많은 사람들 (나를 포함하여)이 생성자 함수를 "클래스"라고 부르는 경우가 많습니다.
Javascript는 객체 지향 프로그래밍 언어이지만 2015 년에 ECMA 스크립트 6 클래스가 도입되었으며 이제 Java와 같은 다른 클래스 기반 언어처럼 사용하기에 적합합니다. 물론 사용자 코드 매지션이 자신의 의견에서 지적했듯이 클래스가 js와 java 또는 기타 "클래스 기반"프로그래밍 언어에서 작동하는 방식 간에는 몇 가지 깊은 차이가 있습니다.
그럼에도 불구하고 js 프로그래밍에서는 다음과 같은 예제 코드를 사용할 수 있습니다.
class Animal {
constructor(name) {
this.name = name;
}
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
그것은 고전적인 클래스 기반 언어와 공통점이 있습니다. 문제는 아직 시작 단계에있는이 새로운 기술의 브라우저 지원입니다. 따라서 프로덕션 제품에 사용하는 것은 여전히 좋지 않습니다. 하지만이 문제가 빨리 해결 될 것이라는 데는 의심의 여지가 없습니다.
따라서 js가이 새로운 기능의 구현으로 인해 클래스 기반 프로그래밍 언어가되었는지 아니면 여전히 객체 프로토 타이핑 지향 프로그래밍 언어로 남아 있는지에 대한 질문이 남아 있습니다.
Javascript에서는 거의 모든 것이 있습니다 object
(객체는 다른 객체에서 상속 할 수 있음). classes
고전적인 의미 에서는 없습니다 .
함수 프로토 타이핑을 통해 기존 클래스 정의 / 인스턴스화의 대부분의 기능을 재현 할 수 있습니다.
Douglas Crockford의 이야기를 들어보세요 :
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2
그는 프레젠테이션에서 귀하의 질문을 직접 언급합니다.
가장 논란이되는 언어의 특징은 상속을하는 방식인데, 이는 사실상 다른 모든 현대 언어와 근본적으로 다릅니다. 대부분의 언어는 클래스를 사용합니다. 저는이를 '고전 언어'라고 부릅니다. JavaScript는 그렇지 않습니다. JavaScript는 수업이 없습니다. 프로토 타입을 사용합니다. 언어를 보는 고전적인 훈련을받은 사람들에게 그들은갑니다 : 음, 이것은 부족합니다. 수업이 없는데 어떻게하면 되나요? 프로그램의 구조가 작동 할 것이라는 확신을 어떻게 가질 수 있습니까? 그리고 그들은 결코 그것을 지나치지 않습니다. 하지만 밝혀졌습니다 ...
"X에는 클래스가 있습니다"라는 말은 일반적으로 객체 지향 프로그래밍 지원을 의미합니다.
예, Javascript는 객체 지향 언어입니다.
클래스를 생각할 때 유형과 클래스를 통해 새로운 유형을 정의 할 수 있다는 사실을 생각합니다. js에서는 새로운 유형을 만들 수 없습니다. 프로토 타입으로 모든 종류의 멋진 oo 작업을 수행 할 수 있지만 모든 것이 여전히 객체라는 사실은 js의 클래스가없는 본질에 실제로 적합합니다. js에 대해 이야기 할 때 '클래스'용어를 사용하는 사람들은 js를 프로토 타입 언어로 사용하는 것과 js를 고전적인 언어로 사용하는 것은 추악한 새 연산자보다 훨씬 더 혼동한다고 생각합니다. 간단히 말해, js가 OO라고해서 클래스가 존재해야한다는 것을 의미하지는 않습니다.
에서 당신-망가-알고-JS의 책에서 https://github.com/getify/You-Dont-Know-JS
4 장 : "클래스"개체 혼합 (위로)
...
JS는 꽤 오랫동안 클래스와 같은 구문 요소 (new 및 instanceof와 같은)를 가지고 있었고 최근에는 ES6에서 class 키워드와 같은 일부 추가 기능이 추가되었습니다.
그러나 그것은 JavaScript가 실제로 클래스를 가지고 있다는 것을 의미합니까? 단순하고 단순함 : 아니오
나는에 복사하는 여기에 과거 다른 부분 만 읽을 것을 권장하고 있지 않다 제 3 장 및 제 4 장 실행 샘플을.
https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch3.md https://github.com/getify/You-Dont-Know -JS / blob / master / this % 20 % 26 % 20object % 20prototypes / ch4.md
다른 답변과 함께 추가하기 위해 javascript에는 클래스가 없지만 클래스와 같은 것으로 설명되는 명령문을보기 시작했지만 문제를 혼동한다고 생각합니다.
JavaScript has prototypes, not classes, but they accomplish the same thing, prototypes are objects that define objects, hence the confusion.
A prototype is a representation of private internal state that a class would manage in Java for example. Instead of putting that internal state in a class and presenting an interface for manipulating behaviour, as in java, JavaScript exposes the data structure for JavaScript programs to manipulate directly.
This is the best description I've found on the subject, Prototypes are not Classes.
Although JavaScript didn't have classes prior to ES6, class-like behavior could be implemented in ES5 by sealing objects (thereby making objects non-extensible). In a sealed object, new properties and methods cannot be added and properties are not configurable. Property values can still be set and read. I say class-like, because there's one caveat. A sealed object's method definitions can still be modified. That's because property values can still be set, unless you change all method properties to be non-writeable -- at which point you've reproduced class behavior pretty closely using ES5.
In simple words - Yes. All you need is Babel.js transpiler, because all browsers does not support it except Chrome browser. A JavaScript class is a type of function. Classes are declared with the class keyword. We use function expression syntax to initialize a function and class expression syntax to initialize a class.
Here is an example of JavaScript class using function:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
AFAIK Javascript use the prototype concept and it's not OO. That's means that you can't use the typical concepts of OOP like inheritance or polymorphism.
참고URL : https://stackoverflow.com/questions/2752868/does-javascript-have-classes
'development' 카테고리의 다른 글
개인 생성자가 필요한 이유는 무엇입니까? (0) | 2020.11.27 |
---|---|
Fiddler의 Request Builder를 사용하여 JSON 요청을 할 수 있습니까? (0) | 2020.11.27 |
여러 HTTP 요청을 병렬로 실행하려고하지만 Windows (레지스트리)에 의해 제한됨 (0) | 2020.11.27 |
Vim에서 왜 'j'는 아래로, 'k'는 위로 사용됩니까? (0) | 2020.11.27 |
최대 절전 모드 4 및 조다 시간 (0) | 2020.11.27 |