powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / [JS] отличия объектов
20 сообщений из 20, страница 1 из 1
[JS] отличия объектов
    #39159687
spider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, хочу спросить следующее. В чем разница между конструкция в JavaScript

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function createA() {
  return {
    b: 13
    c: 14
  }
}

var a = createA();



и

Код: javascript
1.
2.
3.
4.
5.
6.
function createA() {
  this.b = 13;
  this.c = 14;
}

var a = new createA();
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39159757
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spider13В чем разница между конструкция в JavaScript
Первая с ошибкой вторая рабочая...
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39159768
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39159796
spider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaspider13В чем разница между конструкция в JavaScript
Первая с ошибкой вторая рабочая...

Хорошо, пропустил запятую, но не в этом суть.

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


skyANA Создание объектов через "new"

Я читал это. Поэтому и возник вопрос.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39159830
oaken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spider13И в первом и во втором случае получаем объект. В чем разница используемых методов и почему тот способ, который я написал первым нигде не используется? Как это "нигде не используются"? - еще как используются. Чаще они вызываются без new, второй вариант принято вызывать с new.
А, так, да, они идентичны. По ссылке указанной выше так и сказано "...любая функция может быть использована как конструктор"
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39159868
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spider13krvsaпропущено...

Первая с ошибкой вторая рабочая...

Хорошо, пропустил запятую, но не в этом суть.

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


skyANA Создание объектов через "new"

Я читал это. Поэтому и возник вопрос.Как это первый способ нигде не используют? Фабричные методы
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39161392
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я обычно создаю объекты вечрез dojo.declare (amd), там один раз забыл new написать, вывалилась ошибка. так что похоже есть какая-то разница )))

через new появляется this, если его не сказать,то это будет просто объект, на сколько я понимю.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39161689
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackчерез new появляется this, если его не сказать,то это будет просто объект, на сколько я понимю.
Я бы сказал "через new можно использовать this". А "простого" объекта или "сложного" не бывает. Объект, он и в Африке объект.

Если хочешь в его определении использовать this - это твой второй вариант. Если this не нужен - подойдет и первый твой вариант.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39162494
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,

а я бы сказал что в первом варианте можно устанавливать геттеры и сеттеры, при чём для синтаксиса во втором варианте я аналогов не нашёл )

ещё я бы сказал, что в первом случае мы получим объект класса object, а во втором класса createA.

в первом мы просто пишем функцию которая возвращает объект не имея в целом к нему никакого отношения, во втором функция выступает конструктором класса (объекта).

для меня немного размыт механизм наследования при использовании первого варианта (особенно речь о наследовании конструкторов).

во втором варианте мы можем писать методы в прототип конструктора, тем самым создавая 1 экземпляр метода даже для 10 объектов этого класса. В первом варианте по указанному синтаксису мы будем пихать методы по 1 экзепляру на каждый объект (расход памяти)



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

если структура объектов сложная и требует наследований и т.д., тогда я бы выбрал второй метод.

Ещё второй метод позволяет имитировать статические свойства. )
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39162501
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, по каждому пункту вопрос Что? Почему?
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163368
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПрограмёр, по каждому пункту вопрос Что? Почему?

jsFiddle ответы тут

со статическими свойствами загнал (их и в первом варианте сделать просто).
всё остальное, кроме моего личного ощущения "размытости" механизма наследования продемонстрированы по ссылке (в том же порядке что и написаны в сообщении).

По поводу "Что?" всё по всё той же ссылке, а "Почему?" - думаю было провокационным вопросом, так как если я смог донести правильно ответ на "Что", то "Почему" при твоём то опыте за секунды прояснится :)

Поправь меня, если я в чём-то не прав.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163388
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется, что это всё игрища вокруг парадигмы ООП

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

имхо чем код проще и короче, тем лучше, да и ошибок меньше.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163390
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, ещё, я-бы пальцы ломал тем, кто привык без ограничений лезть в прототипы,
это надо делать только в самых ответственных и редких случаях.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163392
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бухалтер фантоццида, ещё, я-бы пальцы ломал тем, кто привык без ограничений лезть в прототипы,
это надо делать только в самых ответственных и редких случаях.

и с чего это вдруг такой вывод? )
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163401
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JS интерпретируемый язык, без строгой типизации, сейчас объект содержит визуальный HTML-элемент, потом он может быть набором полей призвольной структуры, в том числе и ссылками на HTML-элементы,
в любой момент можно у любого объекта поменять что угодно, в отличие от компилируемых языков со строгой типизацией.
JavaScript создан для работы с DOM браузера, а в него суют ООП.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163407
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavaScript оказался очень удачным средством, если не загонять его в рамки той или иной парадигмы, утверждая при этом, что "вот такой подход к пректированию и есть самый правильный".
JS тем и хорош, что для определённого круга задач он обладает рядом несомненных преимуществ и позволяет очень многое сделать простейшим способом.
имхо не стоит усложнять то, что и так работает отлично.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163423
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бухалтер фантоцциJS интерпретируемый язык, без строгой типизации, сейчас объект содержит визуальный HTML-элемент, потом он может быть набором полей призвольной структуры, в том числе и ссылками на HTML-элементы,
в любой момент можно у любого объекта поменять что угодно, в отличие от компилируемых языков со строгой типизацией.
JavaScript создан для работы с DOM браузера, а в него суют ООП.

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

P.S. речь не о __proto__ (или как он там правильно). Я бы сказал что прото вообще трогать противопоказано. ))
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163489
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, вот ты проиллюстрировал кодом и вопросы отпали. Сразу бы так :) Спасибо.
...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163492
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрЯ не представляю что надо иметь в голове, что бы пробовать изменить прототип конструктора, не будучи уверенным, какого именно конструктора.
Так в этом как раз всё дело - прототип нужно менять, чтобы правильно использовать всю мощь прототипного наследования!

JavaScript силён именно своим прототипным наследованием, в отличие от классического ООП,
прототипы показывают себя при работе объектов - дают гибкость, недостижимую для классического наследования.

Обычно цель заморочек одна - повторное использование кода, чтобы однотипный код не дублировался и экономилась память.
JavaScript позволяет это прекрасно делать без конструкторов и прототипов.
Насильно пихать ООП в JS не вижу никакого смысла, это на любителя, потому что преимуществ никаких нет,
но как правило, возможности прототипов тухло используются для синтаксического сахара ООП .
Многие даже не понимают, какие возможности у них в руках, выучили ООП-фреймворк - и впирёд!

я вижу смысл использовать собственные конструкторы и прототипы только для осознанных действий, например:
массовое изменение существующих объектов (добавление свойств, изменение поведения через методы-прототипы).
То-есть для облегчения групповых изменений уже созданных объектов, а не только лишь ради создания объектов!
В этом и есть сила прототипного наследования! ООП тут не причём, но часто больше мешает, чем помогает.

Но так-же можно и массово испортить существующие объекты, поэтому всюду пихать конструкторы и прототипы глупо.

Повторяю - в JavaScript с любым существующим объектом можно сделать что угодно, независимо от способа его создания,
this работает надёжно только в конструкторе, в остальных случаях его нужно отслеживать и проверять.

--------------------------------------------------------------------------------
Ниже простые примеры, иллюстрирующие сказанное, один с прототипами, другой без.
Оба типа создания и работы с объектами необходимы и используются в разработке.
Рекомендую открыть в соседних вкладках и сравнивать по шагам (лучше не в хроме - там alert блокирует переключение между вкладками).

Использование прототипов и конструкторов
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<!DOCTYPE html>
<html>
<title>Смена поведения всех существующих объектов</title>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
var v1, v2;

function C1() { this.prop1=1; } // наш "конструктор"
C1.prototype.m = function() { return this.prop1; } // наш "общий" метод

v1 = new C1(); // без new будет неверный this в конструкторе

function f_view() {
	v2 = new C1();
	alert('Старый объект:\n\nv1.m() : '+v1.m()+'\nv1.m.call( window ) : '+v1.m.call(window)+'\nv1.prop1 : '+v1.prop1+'\nv1.prop2 : '+v1.prop2+'\n\nНовый объект:\n\nv2.m() : '+v2.m()+'\nv2.m.call( window ) : '+v2.m.call(window)+'\nv2.prop1 : '+v2.prop1+'\nv2.prop2 : '+v2.prop2);
}
function f_change() { // Здесь ОСОЗНАННЫЕ изменения прототипа.
	C1.prototype.prop2='abc'; // "задним" числом КО ВСЕМ существующим объектам добавляется свойство prop2
	C1.prototype.m = function() { // Изменение поведения ВСЕХ существующих объектов, созданных в "конструкторе" C1
		if(this!=window) this.prop1=999;
		return this.prop2;
	};
}
</script>
</head>
<body>
<input type="button" value="view" onclick="f_view()"/><br><br>
<input type="button" value="change" onclick="f_change()"/>
</body>
</html>

Без прототипов
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<!DOCTYPE html>
<html>
<title>Смена поведения только новых объектов</title>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
var v1, v2;

function c1() { return { prop1: 1, m : c1f	} } // создание однотипных объектов
function c1f(){ return this.prop1; } // наш общий метод

v1 = /* new */ c1(); // для нас разницы нет как определять объект (наличие new), потому что мы не используем явно его протопиты.

function f_view() {
	v2 /* new */ = c1();
	alert('Старый объект:\n\nv1.m() : '+v1.m()+'\nv1.m.call( window ) : '+v1.m.call(window)+'\nv1.prop1 : '+v1.prop1+'\nv1.prop2 : '+v1.prop2+'\n\nНовый объект:\n\nv2.m() : '+v2.m()+'\nv2.m.call( window ) : '+v2.m.call(window)+'\nv2.prop1 : '+v2.prop1+'\nv2.prop2 : '+v2.prop2);
}
function f_change() {
	c1f = function() { // Меняю поведение ТОЛЬКО НОВЫХ создаваемых объектов, старые - без изменений!
		if(this!=window) {this.prop1=999; this.prop2='abc';}
		return this.prop2;
	};
}
</script>
</head>
<body>
<input type="button" value="view" onclick="f_view()"/><br><br>
<input type="button" value="change" onclick="f_change()"/>
</body>
</html>

...
Рейтинг: 0 / 0
[JS] отличия объектов
    #39163622
spider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы, в общем разобрался.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / [JS] отличия объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]