Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / [JS] отличия объектов / 20 сообщений из 20, страница 1 из 1
01.02.2016, 00:46
    #39159687
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JS] отличия объектов
Всем привет, хочу спросить следующее. В чем разница между конструкция в 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
01.02.2016, 08:13
    #39159757
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JS] отличия объектов
spider13В чем разница между конструкция в JavaScript
Первая с ошибкой вторая рабочая...
...
Рейтинг: 0 / 0
01.02.2016, 08:48
    #39159768
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JS] отличия объектов
...
Рейтинг: 0 / 0
01.02.2016, 09:35
    #39159796
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JS] отличия объектов
krvsaspider13В чем разница между конструкция в JavaScript
Первая с ошибкой вторая рабочая...

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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



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

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

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

jsFiddle ответы тут

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

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

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

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

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

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

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

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

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


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