Почему / Как я должен использовать объекты в JavaScript? - PullRequest
12 голосов
/ 03 августа 2011

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

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

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

function hi() {
    return "Hello";
}

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

Ответы [ 7 ]

14 голосов
/ 03 августа 2011

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

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));
5 голосов
/ 03 августа 2011

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

  1. Они с состоянием.
  2. Они могут хранить отношения между строками и данными.
  3. Проще разбить проблему, разбив ее на объекты, которые собирают связанные операции и состояния.

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

4 голосов
/ 03 августа 2011

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

2 голосов
/ 03 августа 2011

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

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

0 голосов
/ 19 октября 2018

Некоторые общие мысли относительно части «Почему»:

Объекты существуют для общения. Это общий словарь для всех, кто участвует в проекте. Люди используются для работы с вещами (объектами) и их операциями (сообщениями или методами), а не просто с отключенными действиями (функциями).

0 голосов
/ 03 августа 2011

Это не столько вопрос "объектов в Javascript", сколько вопрос об объектах в целом.

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

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

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

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

    Когда вы смотрите на код с тоннами«switchs»:

    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 и остальной код ничего не заметят.

  2. Наследование + повторное использование методов

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

0 голосов
/ 03 августа 2011

Он пытается смоделировать парадигму ООП, вот и все. Есть разные способы сделать это. Но спросите себя, принадлежат ли 'hi' в 'obj' или это может быть автономная функция? Все дело в том, насколько тесно связана функция с объектом. Нужна ли функции доступ к закрытым переменным объектов и тому подобное?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...