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

Почему/Как использовать объекты в JavaScript?

Я понимаю, как создавать объекты и называть их, но я просто не могу найти причины использовать их в моем script. Я мог бы сделать

var obj = {
    hi: function() {
        return "Hello";
    }
}; 

но почему я не могу сделать это так же, как:

function hi() {
    return "Hello";
}

Я никогда не понимал причин, по которым я должен использовать прототипирование. Большинство вещей, которые я делаю в JavaScript, я могу обойтись без объектов. Но я хочу использовать объекты. Что такое объекты и каковы причины, по которым я должен их использовать?

4b9b3361

Ответ 1

Объекты полезны, например, для того, чтобы сделать единицу из значений, которые принадлежат друг другу. Пример:

function Person(firstName, lastName, gender, age) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.gender = gender;
  this.age = age;
}

Person.prototype = {
  getFullName: function() { return this.firstName + ' ' + this.lastName; },
  isMale: function() { return this.gender == 'Male'; },
  isFemale: function() { return this.gender == 'Female'; }
};

var amanda = new Person('Amanda', 'Smith', "Female", 42);
var john = new Person('John', 'Doe', 'Male', 72);

alert(amanda.getFullName());
alert(john.isMale());

По сравнению с менее структурированным:

function getFullName(firstName, lastName) {
  return firstName + ' ' + lastName;
}

function isMale(gender) {
  return gender == 'Male';
}

function isFemale(gender) {
  return gender == 'Female';
}

var amandaFirstName = 'Amanda';
var amandaLastName = 'Smith';
var amandaGender = 'Female';
var amandaAge = 42;
var johnFirstName = 'John';
var johnLastName = 'Doe';
var johnGender = 'Male';
var johnAge = 72;

alert(getFullName(amandaFirstName, amandaLastName));
alert(isMale(johnGender));

Ответ 2

Объекты полезны, потому что

  • Они с точки зрения состояния.
  • Они могут хранить отношения между строками и данными.
  • Легче разложить проблему, разбив ее на объекты, которые собирают связанные операции и состояние.

Если вам не нужно неглобальное состояние, вам не нужны таблицы поиска, и ваша проблема небольшая или более легко разложится функционально, тогда не используйте объекты.

Ответ 3

Без того, что вы называете объектами, у вас будут свободные функции по всему месту. Это очень часто приводит к тому, что код очень трудно поддерживать. На минимальных минимальных объектах вы можете комбинировать функции вместе, чтобы имитировать пространства имен - и это на минимальном минимуме.

Ответ 4

В вашем простом примере бессмысленно писать полу-класс/объект для хранения этого метода. Но когда ваш код растет, вы получаете все больше и больше функций и методов, вы действительно не хотите, чтобы все они были в одном большом (глобальном) пространстве имен. Это просто невозможно остановить, никто не поймет этот код, включая вас в какой-то более поздний момент.

Это первая хорошая причина для объединения методов в объект/ "класс". Другая веская причина - повторная атака. Если вы пишете объекты, способные наследовать их методы, вы можете повторно создать другой объект и отвлечь его оттуда. Самая простая концепция, но вы хотите ее использовать, если вы описываете "вещи" в своем приложении как модуль/объект.

Ответ 5

Он пытается имитировать парадигму ООП, что все. Существуют различные способы сделать это. Но спросите себя: "hi" принадлежит "obj" или может быть автономной функцией? Его все о том, насколько тесно связана функция с объектом. Требуется ли функции для доступа к частным переменным объектов и тому подобное?

Ответ 6

Это меньше "объектов в Javascript" и больше объектов в целом. Вопрос.

Я бы сказал, что наиболее подходящий Javascript Единственное, что Javascript относится к объектам, - это их аккуратное использование при расширении имен. Например, большинство библиотек Javascript собирают все свои материалы в одном объекте, чтобы избежать столкновения пространства имен:

dojo.create( ... )
dojo.connect( ... )

Что касается других вопросов, почему ООП, есть две основные вещи, о которых я думаю, ООП превосходит (общие, немые, примеры следуют):

  • Динамическая диспетчеризация - избавиться от "ifs" и поставить ответную реакцию там, где она принадлежит

    Когда вы смотрите на код с тоннами "переключателей":

    function doStuff(animal){
        if animal is a tiger:
            print_tiger_roar();
       else if animal is a cow
            print_cow_moo();
    
       if animal is a tiger:
            print_tiger_wants_meat();
       else if animal is a cow
            print cow_wants_grass();
    

    Возможно, было бы неплохо связать каждый разный вид поведения в другом виде и вместо этого использовать динамическую диспетчеризацию:

    function doStuff(animal):
       animal.print_speak();
       animal.print_food_type();
    

    Теперь, если вы придумаете другой вид животного в будущем, вам не нужно искать свой код, чтобы добавить его - все, что вам нужно сделать, это создать новый класс с соответствующими методами print_speack и print_food_type и остальная часть кода ничего не заметит.

  • Наследование + методы повторного использования

    В обычном языке OO каждый объект хранит (и тратит память) для своих переменных экземпляра, тогда как все методы + статические переменные хранятся в одном месте классом. Javascript не имеет классов, но у него есть прототипы, и в конце они выполняют одну и ту же базовую функцию.