Почему/Как использовать объекты в JavaScript?
Я понимаю, как создавать объекты и называть их, но я просто не могу найти причины использовать их в моем script. Я мог бы сделать
var obj = {
hi: function() {
return "Hello";
}
};
но почему я не могу сделать это так же, как:
function hi() {
return "Hello";
}
Я никогда не понимал причин, по которым я должен использовать прототипирование. Большинство вещей, которые я делаю в JavaScript, я могу обойтись без объектов. Но я хочу использовать объекты. Что такое объекты и каковы причины, по которым я должен их использовать?
Ответы
Ответ 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 не имеет классов, но у него есть прототипы, и в конце они выполняют одну и ту же базовую функцию.