Jump to content
Korean Random

объекты 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
Link to comment
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
Link to comment
Short link
Share on other sites

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

 

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

 

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

Edited by StranikS_Scan
Link to comment
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
Link to comment
Short link
Share on other sites

Dart или CoffeScript

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

Edited by Azbuka_slovensko
Link to comment
Short link
Share on other sites

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

 

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

Link to comment
Short link
Share on other sites

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

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

  • Upvote 1
Link to comment
Short link
Share on other sites

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

Edited by Traveler
Link to comment
Short link
Share on other sites

 

 

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

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

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

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

 

 

Nim еще есть.

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

 

 

 

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

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

Link to comment
Short link
Share on other sites

  • 2 weeks later...
Необходимо,что бы при создании объектов этого свойства у них не было...

 

Зачем вам надо это? Скорее всего, вам достаточно объявить 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
Link to comment
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
Link to comment
Short link
Share on other sites

но влюбой момент,любому элементу "i" нужно создать свойство value   и метод

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

Edited by norkas
Link to comment
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...