Создание прототипа
Вот создал я прототип, и так и не понял для чего они, отнимают столько же времени, для создания свойства обычным способом.
https://jsfiddle.net/e89zj0zj/ |
DivMan,
ты обдолбанный чтоли пишешь? для ООП, они, для проектирования |
function Car(model, color){ this.model = model; this.color = color; } Car.prototype = { recolor: function(newColor) {this.color = newColor}, priceOrDefault: function(){return this.price ? this.price : 10000} } Object.defineProperty(Car.prototype, "all", {get: function(){ return this.model + " " + this.color} }) var car1 = new Car("BMW ", "Black"); var car2 = new Car("Lada ", "Blue") car2.price = " 700 000 RUB" console.log( car1.all, car2.all) car1.recolor("silver") console.log( car1.all, car2.all) console.log(car1.priceOrDefault(), car2.priceOrDefault()) |
Почему в консоле не отображается созданное свойство?
function User(name, age){ this.name = name; this.age = age; this. admin = false; } var u1 = new User("Vasya", 22); User.prototype.x = 10; u1 должно быть так: User {name: "Vasya", age: 22, admin: false, x: 10} |
Почему не удаляется прототип?
var F = function () { this.a = 1; } var f = new F(); F.prototype.a = 44 f.a = 33 delete f.a delete f.a delete f.a |
DivMan,
троль? |
нет, почему он не удаляется?
|
Я кажись начинаю понимать
|
Цитата:
|
Цитата:
|
Цитата:
for(;;){delete f.a;}; |
Cache, тут на самом деле одного бесконечного цикла мало будет. Как минимум, два, и рекурсию:
while(1) delete f.a; for(;;) delete f.a; function deleteFA() { delete f.a; deleteFA() }; deleteFA(); |
Ruslan_xDD,
два цикла + рекурсия, эт хорошо, но не в таком же виде, у вас же 95% кода, просто простаивает тут как минимум, надо параллельными потоками запускать |
:D :D :D
|
Почему ResetableCounter is not defined?
function Counter(init){ this.init = init; this.counter = init; } Counter.prototype.inc = function(){ this.counter++ } ResetableCounter.prototype = Object.create(Counter.prototype) ResetableCounter.prototype.reset = function(){ this.counter = this.init } let c = new ResetableCounter(100) c.inc() c.inc() |
DivMan, расскажи на русском языке чего ты хочешь, вдруг оно уже давно сделано.
|
Почему опять undefined? Я хочу создать объект 'o', такой же, как и объект 'obj', только с помощью конструктора
https://jsfiddle.net/3c7ahtrv/ |
Так надо добавить return сюда
this.setName2 = function (name) { this.name = name; return 'Какую траву ты куришь '+name+'?'; }; И тогда console.log(o.setName2('vova')); с тобой заговорит на твоем языке. Зацени https://jsfiddle.net/3c7ahtrv/1/ |
Цитата:
|
Как интерпретатор находит функцию getName в __proto_, если её там нету? Она находится не в __proto_ а в конструкторе
https://jsfiddle.net/mq6ubzem/ http://i77.fastpic.ru/big/2016/0816/...c92037b9ac.jpg |
А он и не находит если не курит ту же самую траву https://jsfiddle.net/mq6ubzem/1/
|
DivMan, прекращай фигней страдать, уже не смешно.
Функция - это подпрограмма, то есть кусок кода лежащий ВНЕ пути следования процессора. Представь себе дорогу - по ней едет телега - это процессор, а по бокам дороги деревни и села и бордели. Если не сворачивать - так и проедешь не увидав ни одной телки, а если свернуть в заведение - то окажешься внутри заведения и там будут телки. Когда ты заходишь в заведение тебя регистрируют - ДивМэн, приехал в 21:34, один, без халата. Когда выходишь из заведения - тебя снимают с регистрации: ДивМэн, 8:12, взял с собой халат. Сколько ты там поимел телок - никому кроме заведения не известно. Это и называется - подпрограмма. То есть кусок кода на адрес которого процессор посылается специальной командой, выполняет коды с этого адреса, доходит до команды возврата на трассу и возвращается на следующий после вызова подпрограммы адрес. Функция - это подпрограмма и более ничего. Это помещение со своими стенами и барахлом внутри. Это полная изоляция своего барахла от внешнего мира в своем собственном адресном пространстве. В некоторых языках так устроены не только функции, но и конструкции вроде if(), for(), где все что объявлено внутри () оказывается внутри стен помещения. То есть смотри, на дороге общего пользования проходящей мимо борделей у нас все публичное, а внутри помещений - частное, или приватное. Есть еще одна разновидность формы собственности - защищенная, это все барахло лежащее во дворе помещения, то есть не внутри и не на дороге. Но в жабе protected явно не объявляется. И вот возникает задача как-то получить частное из функции ДО завершения ее работы, в любой произвольный момент так сказать. Для этого и придумана такая форма функции как класс или его рабочая копия - объект. Когда ты внутри функции пишешь this.name = 'Вася'; то значит хочешь сделать так, чтобы можно было получить из ее значение частной переменной name, положить в грузовик и увезти по дороге в другое помещение. Не саму переменную, а ее значение, то есть груз. Все остальное - это всего лишь синтаксис и усложнение этой элементарной простоты подпрограмм, помещение которых оборудовано окнами приема-выдачи всякого барахла. Прекращай выдумывать собственную реальность и не кури траву. |
Да я реально не понимаю
|
А вот это нормальный код для калькулятора?
https://jsfiddle.net/yhvguf9o/ |
почему переменные не обнуляются, если вызвать объект несколько раз, с одинаковыми аргументами, то ответ будет разный
https://jsfiddle.net/vrbse5qg/2/ |
Если ты хочешь сделать калькулятор, который будет считать выражения вроде 3+5-(sqr(3)-lg(4))/2.56*0.001 и так далее, тебе не нужна вся эта тряхомудия классического жанра. Тебе нужен токенизатор, то есть программа, которая разбирает любое математическое выражение или форумул на токены и вычисляет токены и выдает результат. В сущности у любого парсера в том числе такого языка как жаба на фронтире токенизатор.
|
Цитата:
Попробуй разъяснить за каким членом корреспондентом ты рисуешь эти бредовые конструкции. Если объект создается по условиям, динамически, ты можешь его строить совершенно обычным образом. 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); }; Прекращай галиматью постить, над тобой же смеются. |
Это мне надо делать, для того, что бы понять прототипы
|
Кстати я тут пропустил эти самые прототипы
Foo.setName=function(name){ - так нельзя, надо Foo.prototype.setName=function(name){ Цитата:
|
Цитата:
Прототипирование - это ниточка с бусами, ну, цепочка, оно так и называется prototype chain. Просто выделили проперть с зарезервированным именем для связи между объектами и протащились. А в классах наследование - это метафора наложения одного чертежа на другой чертеж. Ну или как в мультипликации наложение одного целлулоида на другой. |
Как эта цепочка работает. Когда интепретатор не находит затребованного метода или свойства, он обращается к проперти - прототип и, если в нее воткнут какой-то объект, интепретатор начинает искать затребованное в том объекте, и если там нету - к его прототипу и так шуршит объектами проникая в следующий через прототип если определено, пока не упрется. ))) Тогда уже делает эксепшн и ты читаешь про ундефайнед.
|
Изначально жаба скрипучая была создана для написания простых сценарием взаимодействия юзера с элементами веб-страницы. То есть изначально она не предназначена для индустриального программирования, а само индустриальное программирование с каждым днем уходило все дальше за горизонты этой жабы, а жабные программисты со всей силы выкручивались пытаясь догнать радугу и плели эти прототипы как ловкие пауки. Ну вот, в новой версии интерпретатора сделали наконец-то чертежи, то есть классы и тем самым приблизили этот пластилин к промышленному стандарту.
|
но эти же классы работают по принципу прототипов?
|
Нет. Прототип - это дерево наподобие папок в твоем компе. Когда в этой папке нет искомого файла, ОС пытается искать его в следующей папке, если в ней нет - в следующей и так пока папки не кончатся или файл будет найден. Функции как объекты в жабе тоже не чертежи, поскольку создавать из них экземпляр не требуется. А класс - это чертеж. Сам по себе это просто код, который нельзя запустить как объект, сперва надо сделать из него объект. И в этом вся мякотка, что ты можешь модифицировать чертежи ДО того, как из них будут произведены объекты, а прототипирование работает только с живыми объектами.
|
возьми меня в ученики
|
Есть разновидность тн статических классов, с которых не делается экземпляр. Есть абстрактные классы, из которых по условию абстрактности нельзя делать экзепляр, с них можно только наследоваться. Это уже тонкости, которых может быть и нету в новой жабе. Я не проверял.
|
DivMan, ты с форума переключись на местную документацию, там русским языком все написано и получше наверно чем я тут калякаю.
|
Почитал что там пишут. Когда-то это было интересным, но теперь инфа уже серьезно устарела, в частности __proto__ этот уже считается юзать некомильфо, типа колхозный стайл. Но ты можешь вот тут почитать о плюсах и минусах https://learn.javascript.ru/classes
Я лично за минусы, ибо с тех пор клиент так разжирел, что беспокоийство о некотором увеличении расхода памяти стремится к нулю, а доступ к привату и паблику из одного места дает полную свободу. DivMan и вообще. Первое, что надо понять в отношении ООП вообще - зачем оно нужно и всякий раз приступая к реализации какой-то фичи понимать, нужны тут объекты, прототипы или может быть понадобятся или легко обойтись функцией с несколькими функциями внутри. |
А можно ли вообще обойтись без ООП, в сложных проектах?
|
Не делай культа из объектно-ориентированного программирования. Нужен объект - нарисуй объект, нужна функция как объект - нарисуй такую, нарисовал просто функцию и потребовалось снабдить ее свойствами - снабди, хочешь собирать объекты из функций по условиям - собирай, короче, жаба скрипучая - чрезвычайно гибкий скрипт, в сущности можно практически все.
Ты бы пописал в Си или в хотя бы Бейсике, сразу бы полюбил Жабу навеки. ))) |
Часовой пояс GMT +3, время: 16:50. |