Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чем отличаются прототипы от классов (https://javascript.ru/forum/misc/25296-chem-otlichayutsya-prototipy-ot-klassov.html)

Livaanderiamarum 01.02.2012 02:39

Чем отличаются прототипы от классов
 
Я не особо разбираюсь в классах хотя и прочитал что это такое вдоль и поперек. Я читал википедию и читаю теорию ооп.
Я пришел к выводу:
Прототипы - это одна из реализаций классов. Может я тупой, а может тупые те кто говорит что в js классов нет?????

Или я не прав? Поправьте. Прототипы это и есть классы еманаврот!

Livaanderiamarum 01.02.2012 02:42

//это разве не класс?
function Cat(a){
this.size = a
}
//а это разве не экземпляр класса?
var cat = new Cat(4)



Нет, может я тупой? Но это же класс! Хоть убейте, но это класс кошек, который создает экземпляры! Может люди просто НЕ ЗНАЮТ?

melky 01.02.2012 02:50

Утро вечера мудренее. Может не стоит пытаться понять ООП JS в 3 часа ночи ? :)

poorking 01.02.2012 02:52

Цитата:

Сообщение от Livaanderiamarum
Прототипы - это одна из реализаций классов.

Прототипное наследование - как вариант реализации наследования. Классов, формально, как таковых конструкций синтаксических в JS нет, но практически, чем конструкторы не классы для своих объектов? Только тем что нет у них такого функционала как у классов, например как в java.
Ограничение прав доступа к полям, абстрактные поля, абстрактные классы и интерфейсы, и так далее.
А в JS - функции-конструкторы объектов, работа с ними похожа на работу классическими классами o_O.

Цитата:

Сообщение от Livaanderiamarum (Сообщение 154434)
//это разве не класс?
function Cat(a){
this.size = a
}
//а это разве не экземпляр класса?
var cat = new Cat(4)


Если вы назовете Cat классом, то не ошибетесь если будете иметь ввиду именно то, что оно из себя представляет

poorking 01.02.2012 02:54

Цитата:

Сообщение от melky
3 часа ночи


Да, пора. Туда. В 7 вставать

Livaanderiamarum 01.02.2012 09:09

Цитата:

Сообщение от poorking
Ограничение прав доступа к полям, абстрактные поля, абстрактные классы и интерфейсы, и так далее.

Ясно, не представляю где это может пригодится. Замыкания же есть чтобы делать приватные переменные, или это костыль типа, а там для этого специальный синтаксис есть?

poorking 01.02.2012 10:45

Livaanderiamarum,
Э то не костыль, а так сказать подражание программированию классами, да можно сделать приватные, статические, приватные статические классы и методы.
function Class() {
	Class.prototype.init.apply(this, arguments)
}

Class.prototype = new function (Class) {
	
	//	private (Вызывается в контексте инстанса)
	function privateMethod () {
	
	}
	
	//	public
	this.init = function () {
		privateMethod.call(this);
	}
	
	//	public static
	Class.staticMethod = function () {
		privateStatic();
	}
	
	//	независим от контекста
	function privateStatic () {
	
	}
	

}(Class);


А в java да, там для этого специальные конструкции

class Class() {
	
	
	public void init () {}
	
	private void privateMethod () {}
	
	public static void staticMethod() {}
	
	private static void privateStatic(){}
}

monolithed 01.02.2012 14:43

Livaanderiamarum, Синтаксические конструкции в разных языках называются по разному. Внимательно прочтите определение класса, нигде не говорится об обязательном присутствии ключевого слова class.

Livaanderiamarum 01.02.2012 17:32

monolithed,
Цитата:

Сообщение от monolithed
Внимательно прочтите определение класса(ссылка на википедию), нигде не говорится об обязательном присутствии ключевого слова class.


Цитата:

Сообщение от Livaanderiamarum
Я читал википедию и читаю теорию ооп.
Я пришел к выводу:
Прототипы - это одна из реализаций классов. Может я тупой, а может тупые те кто говорит что в js классов нет?????
Или я не прав? Поправьте. Прототипы это и есть классы еманаврот!


тред не читай @ сразу отвечай

Gozar 01.02.2012 17:42

Цитата:

Сообщение от Livaanderiamarum (Сообщение 154593)
Зачем нужны приватные методы? Зачем мне пытаться от себя что-то скрыть?

Зачем здесь var?

var a = 10;

function F() {
    var a = 20; // зачем здесь var?
}

Livaanderiamarum 01.02.2012 17:44

Ясно.

//  private (Вызывается в контексте инстанса)



я вот это не понял, он вызовится каждый раз при создании сущности относительно неё. А потом доступен не будет. Но зачем это нужно? Что я смогу с этим делать? Можно пример

poorking 01.02.2012 18:15

Livaanderiamarum,
Это в моем примере он вызывается только при создании сущности, но потом то он тоже будет доступен, но только внутри того scope естественно, в котором он определен. Если вы будете расширять класс public методами "снаружи", то конечно, он доступен не будет.

Цитата:

Сообщение от Livaanderiamarum
Но зачем это нужно?

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

var AwesomeParser = function () {
	AwesomeParser.prototype.init.apply(this, arguments);
}

AwesomeParser.prototype = new function (AwesomeParser) {
	
	/**
	 *	@public @Array parsed
	 *	@description Распарсенная строка
	 */
	this.parsed = [];
	
	/**
	 * @public @Fucntion init( @String string ) : @void
	 * @description Инициализирует инстанс со строкой
	 */
	this.init = function (string) {
		
		if (typeof string === "string") {		
			this.parsed = parseString(string);
		}
	}
	
	this.valueOf = function () {
		return prettifyParsed.call(this);
	}
	
	/**
	 *	@private @static @RegExp R_DIGIT
	 */
	var R_DIGIT = /\d+/g;
	
	/**
	 *	@private @static @Function parseString( @String string ) : @Array
	 *	@description Возвращает массив вхождений цифр
	 */
	var parseString = function (string) {
		return string.match(R_DIGIT);
	}
	
	/**
	 *	@private @Function prettifyParsed() : @Array
	 *	@descriptoin Преобразует массив строк в массив чисел
	 */
	var prettifyParsed = function () {
		return this.parsed.map(function (strd) {
			return +strd;
		});
	}

}(AwesomeParser);

var parser = new AwesomeParser();


parser.init("1000 и 1 ночь");

alert(parser.valueOf());


Лично мне нравится так программировать (это очень грубый пример, тут можно просто 1 метод написать и все), кому как, зато такой класс легко расширяется, модифицируется и так далее и читать удобно

Livaanderiamarum 01.02.2012 18:31

Можно вкратце нубу мне, какие там методы бывают, приватные статические и.т.п. просто перечисли, а я загуглю)

poorking 01.02.2012 18:41

public protected private, если вы об уровнях доступа или как там это называется, также бывают static поля/методы, но это не о разграничении доступа, abstract поля/методы/классы - отдельная глава, интерфейсы, еще глава. Лучше книгу почитайте про java или c++ если и правда интересно, а не трололо, потому что, вроде как именно в этих ЯП то самое (я сам эти языки не знаю), классическое ООП, кроме разделения прав доступа к свойствам еще очень много всего другого супер интересного, вложенные классы например, перегрузка методов, строгая типизация и про все это немало информации, это не в туалете с айпэдом посидеть

Livaanderiamarum 01.02.2012 18:42

Я все еще не понимаю зачем нужны классы, если я делаю игру и делаю там пули, я опишу класс пули. Они смогут у меня летать, иметь вектор скорость, пораждать взрывы при столкновении, взрывы тоже опишу. У пулей есть приватный метод лететь() , снаружи к нему доступа нет. Снаружи доступны только .стартовать() .остановить()

Как тут можно использовать приватные переменные и методы? Я просто не понимаю ЗАЧЕМ это может понадобится? Можешь привести пример? Я ведь хочу иметь возможность снаружи манипулировать пулями, а не только чтобы они сами манипулировали собой. Есть какие-то причины по которым я могу НЕ ЗАХОТЕТЬ иметь возможность манипулировать ими еще и снаружи? то есть зачем мне может понадобится СКРЫВАТЬ метод лететь() и делать его приватным ??

Потому чт я могу нечайно его вызвать, хотя пуля должна вызвать его сама внутри себя как устройство, и тогда я случайно могу нарушить её работу потому? или могу случайно перезаписать? типа того?

То есть по сути есть обьект JSON он имеет 2 метода stringfilty и parse они публичные, но внутри у него есть туева хуча методов приватных, и мне намеренно не дали возможность их трогать потому что ему самому виднее как ими пользоваться, так? Так же и тут, пулям виднее как им лететь, и во время полета я не должен изменять принцип летения, а то пуля будет лететь "неправильно". Я могу сказать ей только, либо лети, либо остановить. а как это делать она уже будет решать сама. Это то есть типа еще для красоты))?

Livaanderiamarum 01.02.2012 18:54

Будь у меня один обьект пули, я бы сделал так

var bullet = (function(){
function start(){ fly() ; fly(); fly()}
function fly(){}

return {start : start}
})()


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

poorking 01.02.2012 18:59

Типа того, есть еще protected access, эти поля доступны только внутри наследников. Попросите чтобы вам посоветовали отличную книгу по java, отличные книги точно есть я не знаю, найдете ответы на все ваши вопросы, прям по оглавлению

Livaanderiamarum 01.02.2012 19:06

poorking, ясно, ну так почему говорят что а js классов нет? Ты же только что показал мне? Имеется ввиду нативной поддержки классов нет, а то что мы делаем там это извраты.. типа..?

п.с. это кстати общепринятый js паттерн класса как я понял)?

Livaanderiamarum 01.02.2012 19:11

/**
* @public @Fucntion init( @String string ) : @void
* @description Инициализирует инстанс со строкой
*/

что означают эти теги) расскажи вкратце, погуглил но все на инглише

poorking 01.02.2012 19:24

Livaanderiamarum,
Цитата:

Сообщение от Livaanderiamarum
это кстати общепринятый js паттерн класса как я понял)?

Я так не думаю, просто мне так нравится, если в прототип Function добавить метод для реализации наследования, то собственно наследовать от классов можно будет.

Цитата:

Сообщение от Livaanderiamarum
почему говорят что а js классов нет? Ты же только что показал мне?

Имеется ввиду что нет того классического ООП как в java, а фактически классы есть везде. Ты сам решаешь что объединить в классы. Вот в php методы mysql_query, mysql_result, mysql_real_escape_string. Если я скажу что эти методы относятся к одному классу то фактически я не ошибусь.

Цитата:

Сообщение от Livaanderiamarum
что означают эти теги

Похоже на синтаксис jsDoc, но в сам jsDoc я не вникал и им не пользуюсь, мне просто нравится так писать. В doc-комментах @\w+ имеют особый стиль во всех IDE, поэтому так удобно читать и документировать код. Ключевые слова выделяю собакой вот и вся логика

Livaanderiamarum 01.02.2012 19:28

fuuu
Цитата:

Сообщение от poorking
наследовать от классов можно будет.

я еще тебя помучаю, как работает наследование классов?

классы Животное Кролик Кот

Кролик и Кот наследуют от Животное

в чем суть? Представители класса Кролик и Кот будут иметь не только методы Кролика и Кота, но еще и методы Животного? Это вся суть))?

poorking 01.02.2012 19:35

Троллите меня чтоли, господин хороший? Я ж не справочник, а вопросы у вас типичные. Обратитесь к литературе пожалуйста

Livaanderiamarum 01.02.2012 19:37

я не буду читать литературу чтобы получить ответ на этот вопрос, подожду пока кто нибудь ответит.

B@rmaley.e><e 02.02.2012 10:58

Цитата:

Сообщение от Maxmaxmaximus
меня за просто так забанили адо снять модера с модераторства.

В интернете кто-то неправ?

monolithed 02.02.2012 13:13

Livaanderiamarum,
Есть такая замечательная книга ActionScript 3.0 для Flash. Подробное руководство в ней все детально описано
Maxmaxmaximus, не надоело клонироваться?

Gozar 02.02.2012 14:09

ООП не применяют ради ООП. Будет нужно сам изучит.

Shaci 02.02.2012 14:18

Цитата:

Сообщение от Livaanderiamarum (Сообщение 154617)
Можно вкратце нубу мне, какие там методы бывают, приватные статические и.т.п. просто перечисли, а я загуглю)

учи PHP5, узнаешь как ООП реализуется

monolithed 02.02.2012 15:05

Цитата:

Сообщение от Shaci
учи PHP5, узнаешь как ООП реализуется

А что в других языках отменили ООП?

Shaci 02.02.2012 15:51

Цитата:

Сообщение от monolithed (Сообщение 154793)
А что в других языках отменили ООП?

ну пусть Java учит,
или C++


Часовой пояс GMT +3, время: 14:35.