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

Объект 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'

Конечно, классы имеют методы и свойства и могут быть инстанцированы - но тогда я мог бы сделать то же самое с любой старой функцией - или нет?

4b9b3361

Ответ 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 и т.д.