Traveler Posted November 2, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted November 2, 2015 Share Posted November 2, 2015 (edited) Кто здесь? Edited November 2, 2015 by kharlashkin 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Traveler Posted November 2, 2015 Author Share 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 Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted November 2, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Traveler Posted November 2, 2015 Author Share 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 Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted November 2, 2015 Share Posted November 2, 2015 А существует ли возможность Сорри, с такими нюансами не помогу, так как непосредственно на JS не программирую. @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted November 2, 2015 Share Posted November 2, 2015 (edited) CoffeScript используй. Edited November 2, 2015 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
Azbuka Posted November 2, 2015 Share Posted November 2, 2015 @Traveler, Я опять настоятельно рекомендую сменить начальный ЯП. Хочется ООП - возьмите Ruby, ибо в JS он очень плох. @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted November 2, 2015 Share Posted November 2, 2015 Хочется ООП - возьмите Ruby, ибо в JS он очень плох. Dart или CoffeScript же) @ Quote Link to comment Short link Share on other sites More sharing options...
Azbuka Posted November 2, 2015 Share Posted November 2, 2015 (edited) Dart или CoffeScript Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу. Edited November 2, 2015 by Azbuka_slovensko @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted November 2, 2015 Share Posted November 2, 2015 Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу. Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted November 2, 2015 Share Posted November 2, 2015 Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. Rust довольно крутой. Думаю заюзать его где-нибудь. D не смотрел. Nim еще есть. Тоже неплохой язык. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Traveler Posted November 2, 2015 Author Share Posted November 2, 2015 (edited) ,Да с радостью бы, да только JS нужен.... Ну ничего, разберусь.... поможет кто так благодарен буду,а нет так и на том спасибо... Edited November 2, 2015 by Traveler @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted November 2, 2015 Share Posted November 2, 2015 Да с радостью бы, да только JS нужен.... Ну значит смотри в сторону Dart или CoffeScript. Там ООП более "элегантен". @ Quote Link to comment Short link Share on other sites More sharing options...
Traveler Posted November 2, 2015 Author Share Posted November 2, 2015 Ну значит смотри в сторону Dart или CoffeScript. Ну по сути если взять JS основа.... @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted November 2, 2015 Share Posted November 2, 2015 Ну по сути если взять JS основа.... Там все по другому. @ Quote Link to comment Short link Share on other sites More sharing options...
Azbuka Posted November 3, 2015 Share Posted November 3, 2015 Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету. D - С++, сделанный правильно. Си++ обрастал фишками постепенно, поэтому теперь он похож на жуткого многоголового монстра. У этого монстра появляются новые головы, которыми никто не умеет пользоваться и никто не может в них разобраться. Посему монстр этот передвигается исключительно вилосипедом из костылей. Rust делает акцент на безопасность и предназначен для клиент-серверных приложений. Go - попытка корпорации добра сделать что-то между Rust и D. Разрабатываться начал примерно тогда же, когда и Rust, и тогда, когда к разработке D присоеденился Александреску. Таким образом, эти языки - ровестники. Nim еще есть. Да, его тоже можно было бы глянуть. Ну по сути если взять JS основа Нет, языки совсем разные. Они лишь транслируются в JS, ибо JS правит в вебе. @ Quote Link to comment Short link Share on other sites More sharing options...
norkas Posted November 18, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Traveler Posted November 21, 2015 Author Share 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 Link to comment Short link Share on other sites More sharing options...
norkas Posted November 22, 2015 Share Posted November 22, 2015 (edited) но влюбой момент,любому элементу "i" нужно создать свойство value и метод Это ключевое предложение, из-за которого через прототипирование не представляется возможным такое провернуть. Если вы через prototype создадите метод, то он появится у всех экземпляров класса (если метода с таким же именем нет у самого объекта). Edited November 22, 2015 by norkas @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.