Traveler 12 Posted November 2, 2015 (edited) Добрый день, js изучаю относительно недавно.. ни как не разберусь с "конструкторами и прототипами" объектов... Может сможет кто согласиться растолковать мне что да как.... Допустим есть конструктор объекта: //кострутор обекта.... function BaseObj(){ this.name = nameCase(); this.rest = checkCache(); } с помощью этого конструктора заполняется массив: function ArrBase(){ var datBaseArr = []; var length = prompt('кол - во объектов:',1); if(!isNumeric(length)){ ArrBase(); } for(var i = 0;i < length;i++){ datBaseArr.push(new BaseObj()); } return datBaseArr; } Как мне добавить свойство любому выбранному объекту из массива и записать в него значение, в нужный мне период времени, допустим по клику мыши... Необходимо,что бы при создании объектов этого свойства у них не было... Например: Object.defineProperty(Здесь к чему привязыват, к BaseObj или же непосредственно datBaseArr? ,"subtrahend", { set: function() {......} }) Edited November 2, 2015 by Traveler 1 Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #297314 Posted November 2, 2015 (edited) Кто здесь? Edited November 2, 2015 by kharlashkin 1 Quote Share this post Link to post Short link Share on other sites
Traveler 12 #297315 Posted November 2, 2015 (edited) Если сделать так: for(var i = 0;i < bases.length;i++){ Object.defineProperty(bases[i], "subtrahend",{ set: function(){ var data = prompt('Вычитаемое'); if ((data >= 0) && isNumeric(data)){return data;} } }) } alert( Object.getOwnPropertyNames(bases[1]) );//name,rest,subtrahend. Но при вызове: bases[1].subtrahend();//caught TypeError: bases[1].subtrahend is not a function Edited November 2, 2015 by Traveler Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #297343 Posted November 2, 2015 (edited) Например: Object.defineProperty(Здесь к чему привязыват, к BaseObj или же непосредственно datBaseArr? ,"subtrahend", { set: function() {......} }) Конечно к datBaseArr, так как ты уже создал объекты типа BaseObj. Если ты "применишь" к BaseObj, то у тебя просто будет новый класс, однако ранее созданные в datBaseArr объекты ни как не изменятся, так как они созданы по образу и подобию первоначального BaseObj. Edited November 2, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Traveler 12 #297345 Posted November 2, 2015 (edited) Конечно к datBaseArr, так как ты уже создал объекты типа BaseObj. Если ты "применишь" к BaseObj, то у тебя просто будет новый класс, однако ранее созданные в datBaseArr объекты ни как не изменятся, так как они созданы по образу и подобию первоначального BaseObj. А существует ли возможность добавления метода к прототипу BaseObj посредством BaseObj.prototype... И почему при проверке alert( Object.getOwnPropertyNames(bases[1]) );//name,rest,subtrahend. а метод не вызывается...... bases[1].subtrahend();//caught TypeError: bases[1].subtrahend is not a function P.S. Может кто сможет помочь мне разобраться в геттерах сеттерах, когда что применять? Edited November 2, 2015 by Traveler Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #297348 Posted November 2, 2015 А существует ли возможность Сорри, с такими нюансами не помогу, так как непосредственно на JS не программирую. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #297365 Posted November 2, 2015 (edited) CoffeScript используй. Edited November 2, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #297382 Posted November 2, 2015 @Traveler, Я опять настоятельно рекомендую сменить начальный ЯП. Хочется ООП - возьмите Ruby, ибо в JS он очень плох. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #297388 Posted November 2, 2015 Хочется ООП - возьмите Ruby, ибо в JS он очень плох. Dart или CoffeScript же) Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #297396 Posted November 2, 2015 (edited) Dart или CoffeScript Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу. Edited November 2, 2015 by Azbuka_slovensko Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #297398 Posted November 2, 2015 Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу. Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #297405 Posted November 2, 2015 Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. Rust довольно крутой. Думаю заюзать его где-нибудь. D не смотрел. Nim еще есть. Тоже неплохой язык. 1 Quote Share this post Link to post Short link Share on other sites
Traveler 12 #297406 Posted November 2, 2015 (edited) ,Да с радостью бы, да только JS нужен.... Ну ничего, разберусь.... поможет кто так благодарен буду,а нет так и на том спасибо... Edited November 2, 2015 by Traveler Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #297407 Posted November 2, 2015 Да с радостью бы, да только JS нужен.... Ну значит смотри в сторону Dart или CoffeScript. Там ООП более "элегантен". Quote Share this post Link to post Short link Share on other sites
Traveler 12 #297409 Posted November 2, 2015 Ну значит смотри в сторону Dart или CoffeScript. Ну по сути если взять JS основа.... Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #297415 Posted November 2, 2015 Ну по сути если взять JS основа.... Там все по другому. Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #297495 Posted November 3, 2015 Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. D - С++, сделанный правильно. Си++ обрастал фишками постепенно, поэтому теперь он похож на жуткого многоголового монстра. У этого монстра появляются новые головы, которыми никто не умеет пользоваться и никто не может в них разобраться. Посему монстр этот передвигается исключительно вилосипедом из костылей. Rust делает акцент на безопасность и предназначен для клиент-серверных приложений. Go - попытка корпорации добра сделать что-то между Rust и D. Разрабатываться начал примерно тогда же, когда и Rust, и тогда, когда к разработке D присоеденился Александреску. Таким образом, эти языки - ровестники. Nim еще есть. Да, его тоже можно было бы глянуть. Ну по сути если взять JS основа Нет, языки совсем разные. Они лишь транслируются в JS, ибо JS правит в вебе. Quote Share this post Link to post Short link Share on other sites
norkas 28 #299106 Posted November 18, 2015 (edited) Необходимо,что бы при создании объектов этого свойства у них не было... Зачем вам надо это? Скорее всего, вам достаточно объявить undefined-поле в конструкторе, и, когда нужно, присваивать полю функцию конкретному объекту. Мне за всё время ни разу не приходилось прибегать ни к геттерам, ни к сеттерам в JS. Возможно, из-за специфичных проектов. А существует ли возможность добавления метода к прототипу BaseObj посредством BaseObj.prototype... И почему при проверке alert( Object.getOwnPropertyNames(bases[1]) );//name,rest,subtrahend. а метод не вызывается...... bases[1].subtrahend();//caught TypeError: bases[1].subtrahend is not a function P.S. Может кто сможет помочь мне разобраться в геттерах сеттерах, когда что применять? Естественно он бросит ошибку. Вы же сами определяли свойство, а тут почему-то захотели вызвать метод. Проверьте чем у вас является свойство subtrahend: console.log(typeof bases[1].subtrahend) set (сеттер) - это некоторая функция, которая будет выполняться при записи нового значения в свойство. (`bases[1].substrahend = "new value"`) get (геттер) - то тоже функция, которая будет выполняться при чтении из свойства (`console.log(bases[1].substrahend)`) Если вы хотите конкретному экземпляру класса сделать новый метод, то так и напишите: bases[1].newMethod = function() { doSomething(); }; Edited November 18, 2015 by norkas Quote Share this post Link to post Short link Share on other sites
Traveler 12 #300181 Posted November 21, 2015 (edited) Зачем вам надо это? А зачем плодить одни и те же методы в самих объектах.... допустим есть конструктор: functin Obj(name,count){ this.name = name, this.count = count } далее из этих объектов формируется массив: function ArrBase(){ var datBaseArr = []; var length = prompt('кол - во объектов:',1); for(var i = 0;i < length;i++){ datBaseArr.push(new Obj(name,count)); } return datBaseArr; } но влюбой момент,любому элементу "i" нужно создать свойство value и метод function(){ return count = count - value; } так вот собственно про это и был сабж.... Просто думаю зачем создавать все это в конструкторе если можно записать в прототипе....... и в нужный момент вызывать нужный метод.... допустим из элементов "i" данного массива нужно будет выборочно создать еще несколько массивов,но уже с набором этих свойст и методов.... Мне за всё время ни разу не приходилось прибегать ни к геттерам, ни к сеттерам в JS Даже если и не так,уметь этим пользоваться ведь нужно :) Edited November 21, 2015 by Traveler Quote Share this post Link to post Short link Share on other sites
norkas 28 #300273 Posted November 22, 2015 (edited) но влюбой момент,любому элементу "i" нужно создать свойство value и метод Это ключевое предложение, из-за которого через прототипирование не представляется возможным такое провернуть. Если вы через prototype создадите метод, то он появится у всех экземпляров класса (если метода с таким же именем нет у самого объекта). Edited November 22, 2015 by norkas Quote Share this post Link to post Short link Share on other sites