16.08.2016, 14:17
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
DivMan, прекращай фигней страдать, уже не смешно.
Функция - это подпрограмма, то есть кусок кода лежащий ВНЕ пути следования процессора. Представь себе дорогу - по ней едет телега - это процессор, а по бокам дороги деревни и села и бордели. Если не сворачивать - так и проедешь не увидав ни одной телки, а если свернуть в заведение - то окажешься внутри заведения и там будут телки. Когда ты заходишь в заведение тебя регистрируют - ДивМэн, приехал в 21:34, один, без халата. Когда выходишь из заведения - тебя снимают с регистрации: ДивМэн, 8:12, взял с собой халат. Сколько ты там поимел телок - никому кроме заведения не известно. Это и называется - подпрограмма. То есть кусок кода на адрес которого процессор посылается специальной командой, выполняет коды с этого адреса, доходит до команды возврата на трассу и возвращается на следующий после вызова подпрограммы адрес.
Функция - это подпрограмма и более ничего. Это помещение со своими стенами и барахлом внутри. Это полная изоляция своего барахла от внешнего мира в своем собственном адресном пространстве. В некоторых языках так устроены не только функции, но и конструкции вроде if(), for(), где все что объявлено внутри () оказывается внутри стен помещения.
То есть смотри, на дороге общего пользования проходящей мимо борделей у нас все публичное, а внутри помещений - частное, или приватное. Есть еще одна разновидность формы собственности - защищенная, это все барахло лежащее во дворе помещения, то есть не внутри и не на дороге. Но в жабе protected явно не объявляется.
И вот возникает задача как-то получить частное из функции ДО завершения ее работы, в любой произвольный момент так сказать. Для этого и придумана такая форма функции как класс или его рабочая копия - объект.
Когда ты внутри функции пишешь this.name = 'Вася'; то значит хочешь сделать так, чтобы можно было получить из ее значение частной переменной name, положить в грузовик и увезти по дороге в другое помещение. Не саму переменную, а ее значение, то есть груз.
Все остальное - это всего лишь синтаксис и усложнение этой элементарной простоты подпрограмм, помещение которых оборудовано окнами приема-выдачи всякого барахла.
Прекращай выдумывать собственную реальность и не кури траву.
|
|
16.08.2016, 15:14
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Да я реально не понимаю
|
|
16.08.2016, 17:41
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
почему переменные не обнуляются, если вызвать объект несколько раз, с одинаковыми аргументами, то ответ будет разный
https://jsfiddle.net/vrbse5qg/2/
|
|
16.08.2016, 18:37
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Если ты хочешь сделать калькулятор, который будет считать выражения вроде 3+5-(sqr(3)-lg(4))/2.56*0.001 и так далее, тебе не нужна вся эта тряхомудия классического жанра. Тебе нужен токенизатор, то есть программа, которая разбирает любое математическое выражение или форумул на токены и вычисляет токены и выдает результат. В сущности у любого парсера в том числе такого языка как жаба на фронтире токенизатор.
|
|
16.08.2016, 18:50
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Сообщение от DivMan
|
почему
|
Потому что ты задолбал. Какие нахрен тебе нужны прототипы вообще? Кто тебя надоумил этой хренью заниматься? Я написал тысячи строк кода на жабе и ни разу не написал .prototype
Попробуй разъяснить за каким членом корреспондентом ты рисуешь эти бредовые конструкции.
Если объект создается по условиям, динамически, ты можешь его строить совершенно обычным образом.
var Foo = function(){};
Foo.name = null;
if(bar)
Foo.setName=function(name){
this.name=bar+' '+name;
};
else
Foo.name=function(){
this.name=name;
};
Все то же самое можно сделать внутри самой функции используя this, вот реальный пример
if(history.pushState)
this.run=function(e){
if(!e || !e.target) return;
var p,el=e.target,url=el.href;
if(!url) {
if((el=el.closest('[data-id]'))
&& (p=el.querySelector('a[href]'))) url=p.href;
else return;
}
if(el.closest('main')) le=el;
stoPe(e);
ajax(url,set_page);
};
else
this.run=function(e){
cOpen(e.target,opts.tmb_css);
};
Прекращай галиматью постить, над тобой же смеются.
|
|
16.08.2016, 20:28
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Это мне надо делать, для того, что бы понять прототипы
|
|
16.08.2016, 20:44
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Кстати я тут пропустил эти самые прототипы
Foo.setName=function(name){ - так нельзя, надо
Foo.prototype.setName=function(name){
Сообщение от DivMan
|
что бы понять прототипы
|
Просто подожди еще немного пока ECMA6 устаканится и не придется этой галиматьи понимать. Там уже есть классы и наследование и конструкторы и доступ к родителю.
|
|
16.08.2016, 20:49
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Сообщение от DivMan
|
что бы понять прототипы
|
Для практики можешь понимать так. Там где внутри функции this, там снаружи в дизайн-тайм - prototype.
Прототипирование - это ниточка с бусами, ну, цепочка, оно так и называется prototype chain. Просто выделили проперть с зарезервированным именем для связи между объектами и протащились.
А в классах наследование - это метафора наложения одного чертежа на другой чертеж. Ну или как в мультипликации наложение одного целлулоида на другой.
|
|
|
|