Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопрос по созданию объектов (https://javascript.ru/forum/misc/24614-vopros-po-sozdaniyu-obektov.html)

Wizout 07.01.2012 18:08

вопрос по созданию объектов
 
в чем разница использования при создании объекта

функции-конструктора
и
инициализатора объекта?

или можно пользоваться тем, чем больше нравится и разницы между ними нет?

Livaanderiamarum 07.01.2012 18:10

разницы нет

Wizout 07.01.2012 18:19

Цитата:

Сообщение от Livaanderiamarum
разницы нет

спасибки, значит буду использовать то, что удобнее =)

Wizout 07.01.2012 18:22

и еще такой вопрос, больше никаких способов создания объектов нету? только эти два? а то не хотелось бы что-то упустить

Livaanderiamarum 07.01.2012 18:35

var obj = JSON.parse("{"+"'a'"+":"+"200"+"}")

как вариант)

или
var q = 200
//наполняем q свойствами)
q.w = 40
q.x = 600

//получаем обьект
q:200 {w:40, x:600}


или так

var q = NULL
//наполняем q свойствами)
q.w = 40
q.x = 600

//получаем обьект
q{w:40, x:600}

Wizout 07.01.2012 19:17

хехе, да такой тоже знаю, но ИМХО, первые два способа конструктор или инициализатор удобнее использовать на мой взгляд

Saqsess 07.01.2012 19:19

Стоян Стефанов в своей книге "JavaScript. Шаблоны" рекомендует пользоваться инициализаторами, а не конструкторами. Можете прочесть, если есть желание.

Wizout 07.01.2012 19:32

Цитата:

Сообщение от Saqsess (Сообщение 148660)
Стоян Стефанов в своей книге "JavaScript. Шаблоны" рекомендует пользоваться инициализаторами, а не конструкторами. Можете прочесть, если есть желание.

а если вкратце написать, почему лучше инициализаторы?

Saqsess 07.01.2012 19:51

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

Wizout 07.01.2012 22:01

а инициализатор в отличие от конструктора создает сразу экземпляр объекта?

Livaanderiamarum 07.01.2012 22:09

Цитата:

Сообщение от Wizout (Сообщение 148708)
а инициализатор в отличие от конструктора создает сразу экземпляр объекта?

всмысле? а что он еще может создать?

Wizout 07.01.2012 23:51

Цитата:

Сообщение от Livaanderiamarum (Сообщение 148714)
всмысле? а что он еще может создать?

с этим вопросом разобрался, просто вначале вы сказали, что разницы нету между инициализатором и конструктором, а разница между ними как раз такая - инициализатор сразу создает экземпляр объекта, а конструктор создает структуру объекта:)

Wizout 07.01.2012 23:52

не очень понял разницу в таких записях
1. car = {
wheels: 4,
color: 'red'
}

2. var book = {
topic: "JavaScript",
fat: true
};

подскажите чем они различаются? 1 это инициализатор, а вторая запись как называется?

Livaanderiamarum 07.01.2012 23:54

Цитата:

Сообщение от Wizout (Сообщение 148746)
с этим вопросом разобрался, просто вначале вы сказали, что разницы нету между инициализатором и конструктором, а разница между ними как раз такая - инициализатор сразу создает экземпляр объекта, а конструктор создает структуру объекта:)

Опять не понял тебя, конструктор создает экземпляр класса Object, и наполняет его структурой.
что не так?


обьясни эту строчку я ни слова не понял
Цитата:

инициализатор сразу создает экземпляр объекта, а конструктор создает структуру объекта

Livaanderiamarum 07.01.2012 23:55

Цитата:

Сообщение от Wizout (Сообщение 148747)
не очень понял разницу в таких записях
1. car = {
wheels: 4,
color: 'red'
}

2. var book = {
topic: "JavaScript",
fat: true
};

подскажите чем они различаются? 1 это инициализатор, а вторая запись как называется?

1) че такое инициализатор ваще?
2) ничем они не отличаются

скажу так, {} это неявный вызов конструктора Object , ок?

Wizout 08.01.2012 00:00

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

Livaanderiamarum 08.01.2012 00:05

Цитата:

Сообщение от Wizout (Сообщение 148755)
ясненько, просто немного не ясно было, почему в первом варианте в конце не ставится точка с запятой, а во втором варианте ставится точка с запятой в конце.

в javascript авторасстановка точек с запятой

Wizout 08.01.2012 00:11

ок ясно, спасиб +) поставил бы еще + в карму, только не дает еще раз плюсить

Livaanderiamarum 08.01.2012 00:18

Цитата:

Сообщение от Wizout (Сообщение 148762)
ок ясно, спасиб +) поставил бы еще + в карму, только не дает еще раз плюсить

че такое карма))?

Wizout 08.01.2012 00:38

еще вопросик один появился, про методы
есть ли разница между
1. описываем функцию отдельно от конструктора объекта, а затем присваиваем ее свойству
2. описываем функцию внутри конструктора, т.е. this.свойство = function(){}

если разницы нету, то можно использовать любой вариант какой удобнее?

Livaanderiamarum 08.01.2012 00:41

Цитата:

Сообщение от Wizout (Сообщение 148767)
еще вопросик один появился, про методы
есть ли разница между
1. описываем функцию отдельно от конструктора объекта, а затем присваиваем ее свойству
2. описываем функцию внутри конструктора, т.е. this.свойство = function(){}

если разницы нету, то можно использовать любой вариант какой удобнее?

да) разницы нету))) какая разница что конструктор метод добавит что вы руками это сделаете))

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

оператор new между нами говоря вообще делает следущее

допустим у нас есть конструктор Cat()

обычные люди делают так
var cat1 = new Cat()

тут оператор new просто создает новый пустой обьект и устанавливает this внутри функции (первой вызванной после него функции) на этот новый обьект, ну и ПРИМЕНЯЕТ к нему Cat(), который и делает свои грязные делишки со свойствами этого пустого обьекта через this))
иными словами var cat1 = {}.Cat() типа того))
как посчитается то что справа, то результат (пустой обьект после воздействия на него функции Cat() ) кладется в то что слева)))

да, кстати ты в прототипах разбираешься)? я могу обьяснить в 3-4 предложения)))

nerv_ 08.01.2012 00:41

Wizout, а проверить перед тем, как спрашивать?) Делайте так, как Вам удобней. Чтобы код хорошо читался и был логичным (если можно так выразиться).

Wizout 08.01.2012 00:58

Цитата:

Сообщение от nerv_ (Сообщение 148772)
Wizout, а проверить перед тем, как спрашивать?) Делайте так, как Вам удобней. Чтобы код хорошо читался и был логичным (если можно так выразиться).

ну я как раз пробую все и так и так попробовал, разницы не увидел, вот и решил спросить может есть все таки разница и я что-то мог упустить из виду=) просто переходя с с# на js столько вариантов записи одного и того же действия немного ставят в тупик, как правильно и лучше написать код

Цитата:

Сообщение от Livaanderiamarum (Сообщение 148771)
да, кстати ты в прототипах разбираешься)? я могу обьяснить в 3-4 предложения)))

до прототипов еще не дошел

Livaanderiamarum 08.01.2012 01:07

Цитата:

Сообщение от Wizout (Сообщение 148778)
ну я как раз пробую все и так и так попробовал, разницы не увидел, вот и решил спросить может есть все таки разница и я что-то мог упустить из виду=) просто переходя с с# на js столько вариантов записи одного и того же действия немного ставят в тупик, как правильно и лучше написать код



до прототипов еще не дошел

Ну короче в ООП типа есть куча обьектов и типа у них есть свойства и методы, и все они занимают память) и людишки придумали общие матоды засовывать типа по папкам чтобы экономить память, у обьектов просто не КОПИРОВАТЬ каждый раз одно и то же свойство или метод а просто записывать его один раз и сувать в каждый обьект ссылку на это свойство или метод), обращаясь к какому то методу он будет доставать его по ссылке их общего хранилища и использовать относительно себя))).
что оч удобно))

Типа того. Так вот Это называется классы и прототипы.
Вся эта дрянь нужна чтобы в одном обьекте методы записать ОДИН РАЗ, а его "дети" смогут юзать эти методы как свои собственные, и дублироваться в каждом ребенке они не будут)))

вначале если ты че-то вызываешь у обьекта, то это ищется в самом нем, если там нет, то ищется в методах отца)))
все просто))

и естественно можно было бы в каждый ребенок КОПИРОВАТЬ какой то метод, но придумали не копировать общие методы а записывать этот метод один раз в ОТЦЕ, а в детях класть только на него ссылку))

- суть такова)))

nerv_ 08.01.2012 01:09

Wizout, я сам до этого изучал язык с более строгим синтаксисом vba. НУ и немного asm'а) По началу возникало аналогичное ощущение. Сейчас прошло) Скоро и Вы это полюбите ;) фридом...) Я, кстати, тоже новичок. В js месяц-полтора. Благо есть форум, где добрые люди объясняют и разжевывают, за что им очередное спасибо)

Wizout 08.01.2012 01:14

Цитата:

Сообщение от nerv_ (Сообщение 148780)
Wizout, я сам до этого изучал язык с более строгим синтаксисом vba. НУ и немного asm'а) По началу возникало аналогичное ощущение. Сейчас прошло) Скоро и Вы это полюбите ;) фридом...) Я, кстати, тоже новичок. В js месяц-полтора. Благо есть форум, где добрые люди объясняют и разжевывают, за что им очередное спасибо)

фридом мне казалось раньше это в с++ но вот как начал оказывается там не было никакой свободы по сравнению с js :) а конструкторами функций мне удобнее пользоваться, чем инициализаторами тем, что это хоть более менее напоминает работу с классами

Livaanderiamarum 08.01.2012 01:14

Цитата:

Сообщение от nerv_ (Сообщение 148780)
Wizout, я сам до этого изучал язык с более строгим синтаксисом vba. НУ и немного asm'а) По началу возникало аналогичное ощущение. Сейчас прошло) Скоро и Вы это полюбите ;) фридом...) Я, кстати, тоже новичок. В js месяц-полтора. Благо есть форум, где добрые люди объясняют и разжевывают, за что им очередное спасибо)

Всегда пожалуйста) бро:)

Livaanderiamarum 08.01.2012 01:16

п.с. ДАА) изучаю JS 5 лет)) посмотрел в сторону других языков - ЖЕСТЬ))

реально НМОго лишних вещей и много не понытного и не нужного..

Например ЗАЧЕМ определть тип переменной??? неужели современные технологии не способны автоматом это делать?? способны) просто те языки появились 200 лет назад)

nerv_ 08.01.2012 01:17

Wizout, а можно вопрос: почему в js потянуло?)
Цитата:

Сообщение от Livaanderiamarum
апример ЗАЧЕМ определть тип переменной??? неужели современные технологии не способны автоматом это делать?? способны)

"Я Вам не скажу за всю Одессу", но в vba если явно не указывать тип переменной, он определяется автоматически.

Wizout 08.01.2012 01:19

Цитата:

Сообщение от Livaanderiamarum (Сообщение 148779)
Ну короче в ООП типа есть куча обьектов и типа у них есть свойства и методы, и все они занимают память) и людишки придумали общие матоды засовывать типа по папкам чтобы экономить память, у обьектов просто не КОПИРОВАТЬ каждый раз одно и то же свойство или метод а просто записывать его один раз и сувать в каждый обьект ссылку на это свойство или метод), обращаясь к какому то методу он будет доставать его по ссылке их общего хранилища и использовать относительно себя))).
что оч удобно))[/b]

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

и еще по поводу того как тут хорошо тут работает GC? чтобы объект быстрее был удален из памяти, стоит ли при прекращении использования объекта присваивать NULL, чтобы он быстрее удалился или это никак не повлияет работу GC?

Wizout 08.01.2012 01:22

Цитата:

Сообщение от Livaanderiamarum (Сообщение 148784)
п.с. ДАА) изучаю JS 5 лет)) посмотрел в сторону других языков - ЖЕСТЬ))

реально НМОго лишних вещей и много не понытного и не нужного..

Например ЗАЧЕМ определть тип переменной??? неужели современные технологии не способны автоматом это делать?? способны) просто те языки появились 200 лет назад)

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

Livaanderiamarum 08.01.2012 01:24

Цитата:

Сообщение от Wizout (Сообщение 148786)
а разве эти дополнительные действия не повлияют на скорость работы сценария никак? я думаю чем меньше лишних действий будет делать браузер, тем быстрее будет работать сценарий

и еще по поводу того как тут хорошо тут работает GC? чтобы объект быстрее был удален из памяти, стоит ли при прекращении использования объекта присваивать NULL, чтобы он быстрее удалился или это никак не повлияет работу GC?

Во первых ВО ВСЕХ языках программирования используют компроми, типа ЛИБО памамять ЛИБО быстродействие)

тот же самый паттерн КЭШ.

Тут то же самое, ПОИСК метода в отце, и в отце отцов занимает время, у папки то ведь тоже может быть куча свойств и нужно по всем пробежаться и посмотреть на их имена совпадают ли с запрашиваемым))
это естественно)

но это так реализовано что движки JS это все оптимизируют так, что НЕ влияет))
они составляют карту, и составляют области видимости) , замыкания)) иными слвоами поиск метода в ОТЦАХ занимает минимум времени потому что физически он ищется не в отцах а в специальном месте области видимости))

Livaanderiamarum 08.01.2012 01:32

Цитата:

Сообщение от Wizout
и еще по поводу того как тут хорошо тут работает GC? чтобы объект быстрее был удален из памяти, стоит ли при прекращении использования объекта присваивать NULL, чтобы он быстрее удалился или это никак не повлияет работу GC?


обьекты в JS удаляются автоматически тогда когда на обеькт перестает существовать хотя бы одна ссылка.

например
var q = {a:20}
q это НЕ имя обьекта, как может показаться, q это лишь ссылка на обьект, то есть ТО что с право создалось и засунулось в память, а ссылка на это засунулась в q

мы так же можем сделать так

var w = q
оператор ровно посмотрел что находится в q? посмотрел что там ссылка, посмотрел что по ней, посмотрел адрес этого в памяти))
сгенерировал новую ссылку, и засунул её в w

теперь в q и w лежит ссылки на одну и ту же область в памяти)) и если
сделать так

q.a = 400
то и w.a станет 400
потому чо это одно и то же) как очевидно))

так вот чтобы УДАЛИТЬ обьект ты думаешь что нужно сделать так:

либо q либо w прировнять к NULL ))

на само деле не так))

это действие просто заменит обьект {a:400} пустым обьектом из нулей, а как известно нули память тоже жрут.

чтобы удалить обьект я уже говорил что нужно удалить все ссылки на него

оператор delete

delete q
delete w


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


Часовой пояс GMT +3, время: 18:34.