Подтвердить что ты не робот

Есть ли у JavaScript классы?

На прошлой неделе у меня был друг. Он заявил, что в JavaScript не было таких вещей, как классы.

Я сказал, что есть, как вы можете сказать, var object = new Object()

Он говорит: "Как не используется class слов, это не класс".

Кто прав?


В качестве примечания; В будущем вам понадобится сжатый классный JS-инструмент:

https://github.com/tnhu/jsface


Изменение: июль 2017 г.

Классы JavaScript, представленные в ECMAScript 2015, в основном представляют собой синтаксический сахар по сравнению с существующим на основе прототипов на основе JavaScript. Синтаксис класса не представляет для JavaScript новую объектно-ориентированную модель наследования. Классы JavaScript обеспечивают гораздо более простой и понятный синтаксис для создания объектов и работы с наследованием.

- Mozilla ES6 Классы: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

4b9b3361

Ответ 1

Технически утверждение "JavaScript не имеет классов" является правильным.

Хотя JavaScript является объектно-ориентированным языком, он не является языком на основе класса - это язык прототипа. Существуют различия между этими двумя подходами, но поскольку JavaScript можно использовать как язык на основе классов, многие люди (включая меня) часто просто ссылаются на функции-конструкторы как "классы".

Ответ 2

Javascript - это объектно-ориентированный язык программирования, тем не менее, в 2015 году было введено 6 классов сценариев ECMA, и теперь правильно использовать их, как и другие языки, основанные на классах, такие как Java. Конечно, как указал пользователь codemagician в своем комментарии, есть некоторые глубокие различия между тем, как классы работают в 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 языком программирования на основе классов из-за реализации этих новых функций или он все еще остается объектно-ориентированным языком программирования, ориентированным на создание прототипов.

Ответ 3

В Javascript почти все есть object (объекты могут наследовать от других объектов). Он не имеет classes в классическом смысле.

Хотя вы можете воспроизвести большую часть функций традиционного определения/создания класса путем прототипирования функций.

Ответ 4

Слушайте Дугласа Крокфорда здесь: http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

Он прямо обращается к вашему вопросу в своем выступлении:

Наиболее спорная особенность языка является то, как это делает наследство, которое коренным образом отличается от практически все другие современными языками. Большинство языков используют классы - я называю их "классическими языками" - JavaScript не работает. JavaScript является бесплатным. Он использует прототипы. Для людей, которые классически обучены, которые смотрят на язык, они идут: ну, это недостаточно. У вас нет классов, как вы можете что-нибудь сделать? Как вы можете быть уверены, что структура ваших программ будет работать? И они никогда не пройдут мимо этого. Но получается...

Ответ 5

Под "языком X есть классы" люди обычно подразумевают поддержку объектно-ориентированного программирования.

Да, Javascript - объектно-ориентированный язык.

Ответ 6

Когда я думаю о классах, я думаю о типах и о том, что классы позволяют мне определять новые типы. В js вы не можете создавать новые типы. Вы можете делать всевозможные причудливые вещи с прототипами, но тот факт, что все по-прежнему остается объектом, действительно поражает класс js без классов. Я думаю, что люди, использующие терминологию "класс" при разговоре о js, смешивают js как язык прототипа vs js как классический язык, даже больше, чем уродливый новый оператор. Короче говоря, только потому, что js OO не означает, что классы должны существовать.

Ответ 7

Чтобы добавить другие ответы, javascript не имеет классов, хотя я начинаю видеть утверждения, где он описывается как нечто вроде классов, но я считаю, что это просто путает проблему.

JavaScript имеет прототипы, а не классы, но они выполняют одно и то же, прототипы - это объекты, которые определяют объекты, а значит и путаницу.

Прототип представляет собой представление частного внутреннего состояния, которое класс будет управлять в Java, например. Вместо того, чтобы помещать это внутреннее состояние в класс и представлять интерфейс для манипулирования поведением, как и в java, JavaScript предоставляет структуру данных для программ JavaScript для непосредственного управления.

Это лучшее описание, которое я нашел по этому вопросу, Прототипы не являются классами.

Ответ 8

Простыми словами - Да. Все, что вам нужно, это transpiler Babel.js, потому что все браузеры не поддерживают его, кроме браузера Chrome. Класс JavaScript - это тип функции. Классы объявляются с ключевым словом класса. Мы используем синтаксис выражения функции, чтобы инициализировать синтаксис выражения функции и класса для инициализации класса.

Вот пример класса JavaScript с использованием функции:

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

Ответ 9

Из книги You-Dont-Know-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/блоб/ведущий/это %20% 26 %20object %20prototypes/ch4.md

Ответ 10

Несмотря на то, что у JavaScript не было классов до ES6, поведение класса в ES5 могло быть реализовано с помощью герметизации объектов (тем самым делая объекты не расширяемыми). В закрытом объекте нельзя добавлять новые свойства и методы, а свойства не настраиваются. Значения свойств могут быть установлены и прочитаны. Я говорю, как класс, потому что там один оговорку. Определения метода закрытых объектов могут быть изменены. Это потому, что значения свойств все еще могут быть установлены, если вы не измените все свойства метода, которые не могут быть записаны, - в этот момент вы довольно тщательно воспроизвели поведение класса с помощью ES5.

Ответ 11

Можно сказать, что ваш друг не знаком с версией javascript для es6. Я также пережил много путаницы с возобновлением работы после того, как перестал программировать на долгое время.

Ответ 12

AFAIK Javascript использует концепцию прототипа, и это не OO. Это означает, что вы не можете использовать типичные концепции ООП, такие как наследование или полиморфизм.