Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипы лучше классов? (https://javascript.ru/forum/misc/24348-prototipy-luchshe-klassov.html)

Livaanderiamarum 27.12.2011 05:27

Прототипы лучше классов?
 
Прототипы же лучше классов? Это как классы, только динамические, разве нет?

trikadin 27.12.2011 05:31

Цитата:

Сообщение от Livaanderiamarum
Прототипы же лучше классов?

Имхо, да.

Цитата:

Сообщение от Livaanderiamarum
Это как классы, только динамические, разве нет?

Нет.

Livaanderiamarum 27.12.2011 05:32

Цитата:

Сообщение от trikadin (Сообщение 146356)
Имхо, да.
Нет.

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

Суть и того и другого в том чтобы экономить память, храня общие свойства и методы единожды.

FINoM 27.12.2011 06:57

Цитата:

Сообщение от Livaanderiamarum
Прототипы же лучше классов?

Как по мне, нет, из-за сложного сопоставления с устоявшейся парадигмой классов. Библиотеки для поддержки традиционного ООП считаю костылями.
Пример с прототипами: у меня есть некий класс X, который при инициализации создает HTML элемент для какой-нибудь информации. Я хочу сделать класс Y, который наследуется от X.
X = function(){ // функция? блжад, это же конструктор, причем тут функция?
   this.elem = document.createElement('div');
}
Y = function(){}
Y.prototype = new X;
//что бы вы думали? Теперь this.elem является одним и тем же объектом для всех экземпляров Y

Livaanderiamarum 27.12.2011 13:26

Цитата:

Сообщение от FINoM (Сообщение 146359)
Как по мне, нет, из-за сложного сопоставления с устоявшейся парадигмой классов. Библиотеки для поддержки традиционного ООП считаю костылями.
Пример с прототипами: у меня есть некий класс X, который при инициализации создает HTML элемент для какой-нибудь информации. Я хочу сделать класс Y, который наследуется от X.
X = function(){ // функция? блжад, это же конструктор, причем тут функция?
   this.elem = document.createElement('div');
}
Y = function(){}
Y.prototype = new X;
//что бы вы думали? Теперь this.elem является одним и тем же объектом для всех экземпляров Y

ну с таким подходом вывод такой что ты не умеешь полноценно пользоваться протатипами. да и вообще рассуждаешь на уровне синтаксиса и.т.п.
Мы говорим про теорию если что.

Nekromancer 27.12.2011 13:32

На этот раз соглашусь с автором темы, по поводу его последнего поста.
FINoM,
Вы как раз таки повесить на классическую систему наследования - классами и так же пытаетесь реализовать наследование в JS.
Правильное наследование:
var a = function(){},
b = function(){};
b.prototype = Object.create(a.prototype);

И прототипы да, лучше. И их тем более не нужно ни с чем там сопоставлять.

Livaanderiamarum 27.12.2011 13:42

Цитата:

Сообщение от Nekromancer (Сообщение 146404)
На этот раз соглашусь с автором темы, по поводу его последнего поста.
FINoM,
Вы как раз таки повесить на классическую систему наследования - классами и так же пытаетесь реализовать наследование в JS.
Правильное наследование:
var a = function(){},
b = function(){};
b.prototype = Object.create(a.prototype);

И прототипы да, лучше. И их тем более не нужно ни с чем там сопоставлять.

Привет, да, но в теории, из-за динамичности, они медленнее. типа

Nekromancer 27.12.2011 13:44

Livaanderiamarum,
тут скорее в теории медленнее язык программирования, из-за динамичности. типа
Но это только в теории.

Livaanderiamarum 27.12.2011 13:49

Nekromancer, то есть прототипы не медленнее классов если абстрагироваться от языка?

Nekromancer 27.12.2011 14:11

Livaanderiamarum,
Ну во первых, даже классы быстрее, то их здесь нет. А есть прототипы, этого не изменишь.
Как на низком уровне реализуются классы представления не имею, но не думаю что будет большое отличие в скорости между двумя динамически типизированными языками одного уровня, где в одном будет прототипное наследование, а в другом привычно классовое.

Livaanderiamarum 27.12.2011 14:20

Цитата:

Сообщение от Nekromancer (Сообщение 146416)
Livaanderiamarum,
Ну во первых, даже классы быстрее, то их здесь нет. А есть прототипы, этого не изменишь.
Как на низком уровне реализуются классы представления не имею, но не думаю что будет большое отличие в скорости между двумя динамически типизированными языками одного уровня, где в одном будет прототипное наследование, а в другом привычно классовое.

разница прототипов и классов в динамичности.

Nekromancer 27.12.2011 14:25

Livaanderiamarum,
Ах, вы про это. Ну тогда вообще не понимаю о какой медленной работе может идти речь. Добавления свойства в прототип, на прямую не влияет на объекты созданные из этого прототипа.

Livaanderiamarum 27.12.2011 14:32

Цитата:

Сообщение от Nekromancer (Сообщение 146424)
Livaanderiamarum,
Ах, вы про это. Ну тогда вообще не понимаю о какой медленной работе может идти речь. Добавления свойства в прототип, на прямую не влияет на объекты созданные из этого прототипа.

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

Nekromancer 27.12.2011 14:40

Livaanderiamarum,
Из-за этой псевдо проблемы они точно не медленее. Хуже - это лишь субъективное мнение любителей классов. Я например могу точно так же не любить классы и говорить, что они хуже, отыскивая массу причин.

Вообще, прототипы это другое, примите это, сколько можно сравнивать. От этого вам не придёт понимание прототипного программирования, а на это как раз лучше было бы потратить своё время.

Livaanderiamarum 27.12.2011 15:05

Nekromancer, а я так бы сказал:
Если бы программы появлялись без программирования, я был бы рад этому.
Мы идем к тому что скоро так и будет. А нравится какой то прием программирования или не нравится, это удел скорее рабов не способных мыслить широко и видеть причины следствий.

trikadin 27.12.2011 15:09

Цитата:

Сообщение от Livaanderiamarum
А нравится какой то прием программирования или не нравится, это удел скорее рабов не способных мыслить широко и видеть причины следствий.

Аффтар жжошь, пеши исчо.

Livaanderiamarum 27.12.2011 15:12

Цитата:

Сообщение от trikadin (Сообщение 146435)
Аффтар жжошь, пеши исчо.

да) Это как раба научили ковать мечи, и потом скажут что изобрели станок, и он будет НЕ РАД(!) этому. Потому что он не видит цели ковки мечей.. По тому что он раб системы. Он приверженец самого процесса, а не получения продукта наиболее эффективным способом. Он раб матрицы.

FINoM 27.12.2011 15:55

Цитата:

Сообщение от Nekromancer
Правильное наследование:
var a = function(){},
b = function(){};
b.prototype = Object.create(a.prototype);

Это наследование только методов.

Nekromancer 27.12.2011 15:58

FINoM,
Это наследование прототипа. В прототипе не только методы, но и обычные свойства.

FINoM 27.12.2011 15:59

Цитата:

Сообщение от Livaanderiamarum
ну с таким подходом вывод такой что ты не умеешь полноценно пользоваться протатипами.

Расскажи как пользоваться прототипами и классовым наследованием.

FINoM 27.12.2011 16:00

Цитата:

Сообщение от Nekromancer
Это наследование прототипа. В прототипе не только методы, но и обычные свойства.

Но конструктор это ведь не прототип?

Nekromancer 27.12.2011 16:01

FINoM,
Причём тут конструктор? Хочешь наследование конструкторов, делай их отдельно, запуская старый конструктор в новом, как это делают в NodeJS. Либо пиши функцию аля createClass/defineClass.

Наследование прототипа никак не относится к конструктору.

FINoM 27.12.2011 16:06

Цитата:

Сообщение от Nekromancer
Наследование прототипа никак не относится к конструктору.

Я тебе говорю о наследовании класса, а не методов и свойств, определенных в прототипе. Или у тебя конструктор всегда пуст?
Цитата:

Сообщение от Nekromancer
запуская старый конструктор в новом

Расскажи, как делать наследование свойств родительского конструктора.

Nekromancer 27.12.2011 16:12

FINoM,
В JavaScript нет классов. Нет, конструктор не всегда пуст. Это не отменяет пред идущего.

Наследие конструкторов:
var a = function(){},
b = function(){
a.apply(this, arguments);
//b construct here
}

Функция наследования в самом общем виде:
function inherits(parent, handler){
var constructor = function(){
parent.apply(this, arguments);
handler.apply(this, arguments);
}

constructor.prototype = Object.create(parent.prototype);
constructor.prototype.__parent__ = parent;
return constructor;
};
var a = function(){
//construct a here
},
b = inherits(a, function(){
//construct b here
});

FINoM 27.12.2011 16:32

Nekromancer, вариант, да. Но всё равно костыль.

Livaanderiamarum 27.12.2011 17:14

Цитата:

Сообщение от FINoM (Сообщение 146467)
Nekromancer, вариант, да. Но всё равно костыль.

1) в чем проявляется костыль?
2) в чем преимущество классов по сравнению с прототипами что нужно использовать костыли?

FINoM 27.12.2011 17:18

Цитата:

Сообщение от Livaanderiamarum
1) в чем проявляется костыль?

В том, что нужно создавать функцию для наследования.
Цитата:

Сообщение от Livaanderiamarum
2) в чем преимущество классов по сравнению с прототипами что нужно использовать костыли?

Первая половина фразы понятна, я выше уже писал.

Livaanderiamarum 27.12.2011 17:32

Цитата:

Сообщение от FINoM
Первая половина фразы понятна, я выше уже писал.

1) зачем сопоставлять прототипы с классами?
2) в чем преимущества классов над прототипами?

FINoM 27.12.2011 18:04

Цитата:

Сообщение от Nekromancer
В JavaScript нет классов. Нет, конструктор не всегда пуст.

Кстати, конструктор чего? Обычно конструктор — это конструктор класса.
Цитата:

Сообщение от Livaanderiamarum
в чем преимущества классов над прототипами?

В том что классы — это классы: простые, понятные, без нужды строить велосипеды. Это устоявшийся элемент ООП, такой же как и процедура в процедурном программировании. Nekromancer предложил решение, о котором я не знал, при том, что программирую на JS уже около двух лет. При наличии классов, не понадобилось бы строить такие костыли.

Livaanderiamarum 27.12.2011 18:06

FINoM, зачем сопоставлять прототипы с классами если при этом вы испытываете трудности?

trikadin 27.12.2011 18:13

Цитата:

Сообщение от Livaanderiamarum
FINoM, зачем сопоставлять прототипы с классами если при этом вы испытываете трудности?

Тролль, блин, это же ты тему начал. Какого теперь спрашиваешь?)

Nekromancer 27.12.2011 18:23

Цитата:

Сообщение от FINoM
Кстати, конструктор чего? Обычно конструктор — это конструктор класса.

Конструктор объекта. Если и есть конструктор класса в языках с классами, то это его декларация. Видимо есть ещё конструктор объекта класса.

Цитата:

Сообщение от Livaanderiamarum
В том что классы — это классы: простые, понятные, без нужды строить велосипеды. Это устоявшийся элемент ООП, такой же как и процедура в процедурном программировании.

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

FINoM 27.12.2011 18:25

Цитата:

Сообщение от Nekromancer
А я никогда не программировал на языках, где есть именно классы, ну может совсем чуть чуть.

Понятно.

Livaanderiamarum 27.12.2011 18:35

Цитата:

Сообщение от trikadin (Сообщение 146500)
Тролль, блин, это же ты тему начал. Какого теперь спрашиваешь?)

Вообще-то тему начал он)!
цитата:
Цитата:

Сообщение от FINoM
Как по мне, нет, из-за сложного сопоставления с устоявшейся парадигмой классов.

вот я и спрашиваю) зачем их сопоставлять если от этого "прототипы не лучше классов")? То есть в чем смысл сопоставления если это разные вещи)? Из за устояния одной из них)? Это же на манер кузница которого я в пример приводил(раба системы)
Нужно объективно сравнивать недостатки и преимущества.) а не на устояние смотреть.
Вот я и прошу сравнить, мыл зачем сопоставлять если вещи разные, к одной привык к другой нет. Это же не определяет лучшесть или хужесть какой-то из них.
)))

(сопоставления не в смысле обсуждения на форуме, а сопоставления в том контексте в котором он сказал)

Nekromancer 27.12.2011 19:33

FINoM,
Ну вы как всегда критичны до невозможности :)

melky 27.12.2011 23:02

объясните мне , что такое классы в javascript.

особенно про абстрактные упомяните, ага.

Riim 28.12.2011 07:48

Цитата:

Сообщение от FINoM
При наличии классов, не понадобилось бы строить такие костыли.

а если при наличии классов что-то понадобиться? Сможешь, пусть и с костылями, сделать прототипы в языке с классами? Скажем в 50 строк кода? Сможешь эмулировать множественное наследование (если его нет) как это сделано в dojo и python? Прототипы намного гибче, и дают возможность каждому изобрести свой велик - в этом их плюс. Минус в производительности, и для многих в их непонимании.


Цитата:

Сообщение от FINoM
что бы вы думали? Теперь this.elem является одним и тем же объектом для всех экземпляров Y

эта проблема легко решается (опять же прототипы дают такую возможность). В mootools есть пример (там только для объектов и массивов, но и дальше допилить не проблема).

FINoM 28.12.2011 07:52

Цитата:

Сообщение от Riim
Сможешь, пусть и с костылями, сделать прототипы в языке с классами?

Нафига они мне?

Riim 28.12.2011 09:11

Цитата:

Сообщение от FINoM
Нафига они мне?

вопрос из серии "зачем мне спички/зажигалка, если у меня есть зажигалка/спички".

Livaanderiamarum 28.12.2011 13:52

Цитата:

Сообщение от FINoM (Сообщение 146720)
Нафига они мне?

Потому что они лучше классов, не думал?


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