Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП и JavaScript (https://javascript.ru/forum/misc/64719-oop-i-javascript.html)

Ostic 31.08.2016 15:39

ООП и JavaScript
 
Здравствуйте.
Недавно начал изучать JavaScript. Есть опыт С, C++, Java и то ли я такой, то ли лыжи не едут ...
Что в JavaScript нет классов в смысле С++, Java?
типа
Код:

class JSClass {
 int a;
JSClass(int b){a=b;};
~JSClass(){};
GetAny(){};
PutAny(){};
}
JSClass A = new JSClass(1);
A.GetAny();

function JSClass(){
}

это и есть типа класс? или я чего-то пропустил?

ksa 31.08.2016 15:53

Цитата:

Сообщение от Ostic
Что в JavaScript нет классов в смысле С++, Java?

Что есть "класс" в твоем понятии?

В JS есть объекты...
http://javascript.ru/object
Вот про ОПП
https://learn.javascript.ru/oop
https://learn.javascript.ru/prototypes

Ostic 31.08.2016 21:04

Цитата:

Сообщение от ksa (Сообщение 427238)
Что есть "класс" в твоем понятии?

если просто, то это именованная область памяти(автоматическая, динамическая или статическая - не суть), в которой хранятся
переменные и функции.
Цитата:

Сообщение от ksa (Сообщение 427238)
В JS есть объекты...
http://javascript.ru/object

это ассоциативный массив или enum (в Си)
кстати, а какой АТД(абстрактный тип данных в основе)
хэш таблица или дерево какое? если их объединять можно, то дерево
Цитата:

Сообщение от ksa (Сообщение 427238)

да, читал про кофемашину ))
почему класс называется function() ?
function CoffeeMachine(power, capacity) {
  var waterAmount = 0;

  this.waterAmount = function(amount) {

функция, внутри которой есть переменная, которая ссылаясь на функцию, которой она принадлежит, от безымянной функции получает значение и при этом надо еще все это "динамически" создать
var coffeeMachine = new CoffeeMachine(1000, 500);
притом что delete нет, а про утечки памяти где-то проскакивало, но еще не читал
массивы работают как очереди на основе массивов FIFO :help:
сортировки поди пузырьковые?:cray:

nerv_ 31.08.2016 21:39

Прототипное программирование
Классы

Ostic 31.08.2016 22:02

nerv_, это именно то, о чем я и спрашивал.
только опять же:blink:
Цитата:

В современном JavaScript появился новый, «более красивый» синтаксис для классов
алилуйя!
Цитата:

class не позволяет задавать свойства-значения
снова сюрприз ...
почему обычные переменные то нельзя было в класс добавить?
ладно будем посмотреть дальше

destus 01.09.2016 05:35

Ostic,
геттеры/сеттеры тебе в помощь...

warren buffet 01.09.2016 06:28

Цитата:

Сообщение от Ostic
это именованная область памяти(автоматическая, динамическая или статическая - не суть), в которой хранятся
переменные и функции.

Это объект, инстансь, а класс - это текст.

warren buffet 01.09.2016 06:35

Цитата:

Сообщение от destus
геттеры/сеттеры

Расскажи плес про это. Какой смысл в get fullName, если я не знаю заранее какое имя будет у переменной, может быть fullName, может быть onceUponAtime... То есть есть в js магия как в php или облом?

destus 01.09.2016 07:02

warren buffet,
А какой тогда смысл в классах? Если у объектов будет разный набор свойств.
Цитата:

магия как в php
а что именно там за магия?...:blink:

ksa 01.09.2016 08:19

Цитата:

Сообщение от Ostic
почему обычные переменные то нельзя было в класс добавить?

Видать тебя все ждали. :D

scrollquest 01.09.2016 08:41

Ostic,
В смысле плюсов и жабы нет, собственно, в плюсах и жабе ООП вообще нет, там нечто, что *принято* называть ООП, по недоразумению. Алан Кей, как известно, не это имел в виду. Соответственно, о наличии там классов тоже как то с натяжкой можно говорить. Короче, то что в плюсах и жабе принято называть классами -- это миксины по сути.

scrollquest 01.09.2016 08:46

Цитата:

Сообщение от Ostic
почему класс называется function()

функции классами часто называют и в JS. Но это только дебилы. Это функции-конструкторы, как правило имеются в виду

Ostic 01.09.2016 16:27

Цитата:

Сообщение от ksa (Сообщение 427340)
Видать тебя все ждали. :D

а это хамством попахивает.:nono:
такое в глаза надо говорить, герой компьютерный.
Цитата:

Сообщение от destus;
А какой тогда смысл в классах? Если у объектов будет разный набор свойств

пожалуй, что да, вы правы - специфика JS
Цитата:

Сообщение от warren buffet;
Это объект, инстансь, а класс - это текст.

согласен, естественно, но, думаю понятно, что это неточность.
хотя после того как в JS function ...
Цитата:

Сообщение от scrollquest;
Алан Кей, как известно, не это имел в виду
в плюсах и жабе ООП вообще нет

вот только не надо... Алан Кей...
я вам больше скажу:"там вообще кроме транзисторов и прочих нанометровых элементов ничего нет..."
давайте об этом не будем, а то уйдем далеко в мат логику и теорию КА.

Bond 02.09.2016 05:59

Я не супер спец но мне TypeScript более человекопонятный и логичный - есть класс, в нем есть конструктор, есть методы, а в JS все понарошку, типа давай напишем function() и понарошку назовем это классом или конструктором, другую function тоже понарошку назовем функцией, более того - можно написать третий раз function и также понарошку назвать методом.
Это не плохо и не хорошо если привыкнуть. Тем более и привыкать то особо не надо - запомнил и все дела.
Ну или забыть чему тебя Javы и другие CLASSные языки учили и принять немного другой подход JS.

warren buffet 02.09.2016 07:57

Bond, js что-то вроде https://en.wikipedia.org/wiki/Value_object или атома водорода из которого непостижимым образом можно сделать золото и бриллианты. А твое мировоззрение креационистское, типа бог создал класс и увидел что это хорошо. На второй день он создал конструктор, на третий деструктор, затем допилил геттеры и сеттеры и в пятницу забухал и бухает до сих пор.

warren buffet 02.09.2016 08:03

Цитата:

Сообщение от destus
Если у объектов будет разный набор свойств.

Это называется как будто lazy binding. Я давно не читаю ничего по прог-сайнс и забыл что читал. Смысл в том, что тебе не надо знать какие там могут быть свойства и методы заранее, а надо их создавать и применять по требованию. В php все это делается легко благодаря __get, __set, __call, __invoke, etc.

Ostic 02.09.2016 10:47

Цитата:

Сообщение от Bond (Сообщение 427440)
Ну или забыть чему тебя Javы и другие CLASSные языки учили и принять немного другой подход JS.

просто поначалу наступает шизофрения: вчера сел на Си писать и область видимости теряю :-?
понятно же что создавая автоматическую переменную
Код:

{int i;}
i за операторными скобками не видна, а я 2 дня подряд сплю по 3 часа и до 6 утра читаю местный учебник и уже сомневаюсь - а не будет ли она видна снаружи?
конструкции типа (func)(), в которые вкладывается совсем разные смыслы...
в том же Си там сортировки, случайные числа (можно по терверу эксперименты ставить), хэш-функции самописанные, деревья(красно-черные и ван эмде боаса), очереди (хоть на списках, хоть на массивах... биномиальные) и т.д. и т.д. и главное четко понимаешь как это работает, сколько памяти потребляет.
а js это совсем иное: более начетническое, тк если не знаешь, как свойство или метод называется, то "давай, дасвиданья"...
сегодня читаю про jQuery. сначала я не мог понять почему такой ажиотаж вокруг jQ, тк глядя на чистый код и глядя на jQ поначалу подумал:"зачем такое городить? надо писать на "чистом" js!" но прочитав несколько глав испытал неописуемое облегчение.
имхо вообще все к jQ придет и через пару лет может и вообще кто интерпретатор напишет(сохранив прежний синтаксис) я бы на это ставку делал.

scrollquest 02.09.2016 11:24

Цитата:

Сообщение от warren buffet
Это называется как будто lazy binding

не lazy а late, и это к наборам полей конкретного экземпляра не имеет ни малейшего отношения, это означает лишь то, что резольвинг происходит в рантайме, в момент вызова.

Bond 02.09.2016 16:46

Ostic,
jQuery всего лишь библиотека, в философию JS ничего нового не приносит, просто добавляет некоторого удобства работы с DOM и Ajax, кроссбраузерности и на ООП не влияет. Вот фреймворки теоретически может и могли бы повлиять или по крайней мере могли бы направить в другой русло, а библиотека есть библиотека - всего лишь прицепчик с удобствами который максимум что сможет сделать - это добавить пару тройку функций в новый стандарт JS

scrollquest 02.09.2016 18:14

Bond,
То что реально и кардинально может изменить(в тч улучшить, сделать мощней) ООП в JS -- это Proxy. Это, фактически, ключ к созданию своей собственной ООП-модели, синтаксически совместимой с нативным синтаксисом

warren buffet 04.09.2016 10:30

Цитата:

Сообщение от scrollquest
резольвинг происходит в рантайме

Ну и хорошо. И как такое сделать на жабе скрипучей?

warren buffet 04.09.2016 10:34

Цитата:

Сообщение от Ostic
i за операторными скобками не видна

В js переменные объявленные внутри конструкций вроде if, for, switch, etc не изолируются. И вообще жаба она скрипучая, то есть скрипт сам по себе не имеет смысла. Ну ты же видел скриптовые API в офисе, 1с, в ФШ и других прогах. В точности такая шняга для браузера как программы.

Походу ты изучаешь программирование на си и жс. А надо на паскале.

scrollquest 04.09.2016 19:16

warren buffet,
this

warren buffet 06.09.2016 07:39

Ты же знаешь, что я тупой. Мне надо пальцем показать. Покажи.

scrollquest 07.09.2016 01:47

warren buffet,
лексическое(ранее) связывание это эквивалент замыканий или выражений с bind. Функция таскает с собой под ковром окружение, и при любом вызове связывается только с ним. При позднем связывании функция резольвит переменные только в момент вызова, независимо от лексического окружения.
o = {a: 1}
o.early = function(){return this.a}.bind(o)
o.late = function(){return this.a}

o1 = {a: 100, early: o.early, late: o.late}

alert([o1.early(), o1.late()])


Сами по себе понятия эти самоочевидны: функция связывается в момент определения(создания) или в момент вызова.
Фактически, термин "позднее связывание" эквивалентен понятию "динамическое связывание". Есть языки, где позднее связывание дефолтно(не требует ключевого слова this, self, etc). Языки в которых оно отсутствует вообще(например, питон, жаба), не являются ООП-языками в том смысле, в котором трактовал ООП Алан Кей. На позднем связывания построены принципы наследования делегированием, в тч и в JS

warren buffet 07.09.2016 10:07

Спасибо. С ходу нихуя не понял, надо обдумать. )))


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