Jump to content
Korean Random
Traveler

объекты JS

Recommended Posts

Добрый день, 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 by Traveler
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Если сделать так:

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 by Traveler

Share this post


Link to post

Short link
Share on other sites
Например: Object.defineProperty(Здесь к чему привязыват, к BaseObj или же непосредственно datBaseArr? ,"subtrahend", { set: function() {......} })

 

Конечно к  datBaseArr, так как ты уже создал объекты типа BaseObj.

 

Если ты "применишь" к BaseObj, то у тебя просто будет новый класс, однако ранее созданные в datBaseArr объекты ни как не изменятся, так как они созданы по образу и подобию первоначального BaseObj.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Конечно к  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 by Traveler

Share this post


Link to post

Short link
Share on other sites

 

 

А существует ли возможность

 

Сорри, с такими нюансами не помогу, так как непосредственно на JS не программирую. 

Share this post


Link to post

Short link
Share on other sites

@Traveler, Я опять настоятельно рекомендую сменить начальный ЯП. Хочется ООП - возьмите Ruby, ибо в JS он очень плох.

Share this post


Link to post

Short link
Share on other sites
Dart или CoffeScript

Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу.

Edited by Azbuka_slovensko

Share this post


Link to post

Short link
Share on other sites

Да, они могут подойти, но лучше найти что-нибудь вообще не касающееся JS, статически типитизированное и с ООП. К примеру D или Rust. Но у этих языков маленькое сообщество. Я увлекаюсь D, но вот ООП лютобешенно ненавижу, и помочь с ним не могу.

 

Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету.

Share this post


Link to post

Short link
Share on other sites

Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету.

Rust довольно крутой. Думаю заюзать его где-нибудь. D не смотрел. Nim еще есть. Тоже неплохой язык.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

,Да с радостью бы, да только JS нужен....  Ну ничего, разберусь.... поможет кто так благодарен буду,а нет так и на том спасибо...

Edited by Traveler

Share this post


Link to post

Short link
Share on other sites

 

 

Да с радостью бы, да только JS нужен....

Ну значит смотри в сторону Dart или CoffeScript.

Там ООП более "элегантен".

Share this post


Link to post

Short link
Share on other sites

 

 

Ну значит смотри в сторону Dart или CoffeScript.

Ну по сути если взять JS основа.... 

Share this post


Link to post

Short link
Share on other sites

 

 

Глянул что это, куда столько языков, причем гибридов?! Эти языки просто заполоняют планету.

D - С++, сделанный правильно. Си++ обрастал фишками постепенно, поэтому теперь он похож на жуткого многоголового монстра. У этого монстра появляются новые головы, которыми никто не умеет пользоваться и никто не может в них разобраться. Посему монстр этот передвигается исключительно вилосипедом из костылей.

Rust делает акцент на безопасность и предназначен для клиент-серверных приложений.

Go - попытка корпорации добра сделать что-то между Rust и D. Разрабатываться начал примерно тогда же, когда и Rust, и тогда, когда к разработке D присоеденился Александреску. Таким образом, эти языки - ровестники.

 

 

Nim еще есть.

Да, его тоже можно было бы глянуть.

 

 

 

Ну по сути если взять JS основа

Нет, языки совсем разные. Они лишь транслируются в JS, ибо JS правит в вебе.

Share this post


Link to post

Short link
Share on other sites
Необходимо,что бы при создании объектов этого свойства у них не было...

 

Зачем вам надо это? Скорее всего, вам достаточно объявить 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 by norkas

Share this post


Link to post

Short link
Share on other sites
Зачем вам надо это?

А зачем плодить одни и те же методы в самих объектах....

допустим есть конструктор:

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 by Traveler

Share this post


Link to post

Short link
Share on other sites
но влюбой момент,любому элементу "i" нужно создать свойство value   и метод

Это ключевое предложение, из-за которого через прототипирование не представляется возможным такое провернуть. Если вы через prototype создадите метод, то он появится у всех экземпляров класса (если метода с таким же именем нет у самого объекта).

Edited by norkas

Share this post


Link to post

Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...