Объект vs Класс vs Функция
Мне было интересно - какая разница между объектами, классами и функциями JavaScript?
Правильно ли я считаю, что классы и функции являются типами объектов?
А что отличает класс от функции? Или они действительно одно и то же, просто термин для них изменяется в зависимости от того, как они используются?
function func() { alert('foo'); } // a function
func(); // call the function - alerts 'foo'
var func2 = function () { alert('hello'); } // acts the same way as 'func' surely?
func2(); // alerts 'hello'
var Class = function() { alert('bar'); }; // a class
var c = new Class(); // an istance of a class - alerts 'bar'
Конечно, классы имеют методы и свойства и могут быть инстанцированы - но тогда я мог бы сделать то же самое с любой старой функцией - или нет?
Ответы
Ответ 1
Как вы уже должны знать, в JavaScript нет классов. Вместо этого функции в JavaScript можно заставить вести себя как конструкторы, предшествуя вызову функции с ключевым словом new
. Это называется шаблон конструктора.
В JavaScript все является объектом, за исключением примитивных типов данных (логических, числовых и строковых) и undefined
. С другой стороны, null
на самом деле является ссылкой на объект, даже если вы можете сначала поверить. По этой причине typeof null
возвращает "object"
.
Функции в JavaScript аналогичны функциям в Lua (т.е. являются вызываемыми объектами). Следовательно, вместо объекта можно использовать функцию. Подобным же образом массивы также являются объектами JavaScript. С другой стороны, объекты можно рассматривать как ассоциативные массивы.
Однако наиболее важным является то, что в JavaScript нет классов, поскольку JavaScript является прототипом объектно-ориентированного языка. Это означает, что объекты в JavaScript непосредственно наследуются от других объектов. Следовательно, нам не нужны классы. Все, что нам нужно, это способ создания и расширения объектов.
Прочитайте следующий поток, чтобы узнать больше о прототипальном наследовании в JavaScript: Преимущества прототипного наследования по классическому?
Ответ 2
Обновление 2015
В javascript есть классы, которые они просто не используются в старых браузерах.
![введите описание изображения здесь]()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Он имеет конструкторы, расширения и т.п.
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(this.name + ' roars.');
}
}
Ответ 3
Класс в JS:
function Animal(){
// Private property
var alive=true;
// Private method
function fight(){ //... }
// Public method which can access private variables
this.isAlive = function() { return alive; }
// Public property
this.name = "Joe";
}
// Public method
Animal.prototype.play = function() { alert("Bow wow!"); }
// .. and so on
Теперь, когда вы создаете объект
var obj = new Animal();
Вы можете ожидать чего-либо от этого объекта, как от объектов на другом языке. Просто усилия по его достижению были немного разными. Вы также должны смотреть на наследование в JS.
Возвращаясь снова к вашему вопросу, я буду переписывать его как:
Class : A representation of a set with common properties.
object : One from the set with the same properties.
var Class = function() {alert('bar');}; // A set of function which alert 'bar'
var object = new Class(); // One of the functions who alert 'bar'.
Ответ 4
JavaScript не имеет классов, а функции - это объекты в JavaScript (первоклассные граждане).
Единственное отличие, которое имеют объекты функции, это то, что они вызываемы.
function func() { alert('foo'); } // a function
- Правильно
func(); // call the function - alerts 'foo'
- Правильно
var func2 = function () { alert('foo'); } // same as 'func' surely?
- Нет, func2
- это другой объект, который, по-видимому, делает то же самое при вызове.
var Class = function() { alert('bar'); };
- Это функция без имени, хранящаяся в переменной Class
.
var c = new Class();
- Функция вызовов, хранящаяся в Class
, снабжает новый пустой объект как this
и возвращает этот объект. Ожидается, что функции, называемые new functionA()
, будут работать как конструкторы и подготовить вновь созданный объект (this
). В вашем случае - конструктор ничего не делает с объектом и просто предупреждает bar
.
Ответ 5
В javascript нет классов. Но есть способы заставить функцию вести себя как класс на других языках.
Здесь очень хорошее объяснение 3 способа определить класс в js
Также была найдена хорошая ссылка для ООП в Javascript
Ответ 6
Объект - это базовый тип в JavaScript, т.е. все пользовательские типы данных наследуют от Object так или иначе. Поэтому, если вы определяете функцию или класс [примечание, на данный момент JS не поддерживает конструкцию класса, но ее предлагается в ECMAScript версии 6], она будет неявно наследоваться от типа объекта.
Классы действительно используются для инкапсуляции логических функций и свойств в один тип/объект, и вы можете "обновить" его с помощью синтаксиса конструктора. Поэтому, если вы определяете класс "Клиент", вы можете создавать его несколько раз, и каждый экземпляр/объект может иметь разные значения. Они могут даже делиться значениями, если вы определяете значение уровня класса с использованием прототипа.
Так как JS не поддерживает конструкцию класса в данный момент, функции могут действительно действовать как индивидуальный метод, так и контейнер для других функций или типов.
Я надеюсь, что с ECMAScript 6 у нас будет четкое разделение между этими конструкциями, аналогичное тому, что у нас есть на других языках, таких как С#, Java и т.д.