Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как граматно создать конструктор (https://javascript.ru/forum/misc/52088-kak-gramatno-sozdat-konstruktor.html)

krutoy 03.12.2014 19:43

Цитата:

Сообщение от danik.js
tsigel, уверен что это правильно будет работать?

Это вот так делается
Class=function(private){
   var f=function(){}
   f.prototype.setPrivate=function(value){private=value}
   f.prototype.getPrivate=function(){return private}
   return new f
}

o1=Class(1)
o2=Class(10)
o2.setPrivate(100)
alert(o1.getPrivate())
alert(o2.getPrivate())

И это основы, тащемта.

danik.js 03.12.2014 19:54

Ну то ест нормально - никак. Ну я так и сказал. Мог бы и не распинаться тут :(

krutoy 03.12.2014 19:55

Цитата:

Сообщение от danik.js
Ну то ест нормально - никак

Скажи, что значит "нормально", я не понимаю.

jsnb 03.12.2014 19:55

Цитата:

Сообщение от danik.js
Как? Чтобы у методов был к ним доступ.

А, да, сорри. С прототипами замыкания не прокатят.

krutoy 03.12.2014 19:57

Цитата:

Сообщение от jsnb
С прототипами замыкания не прокатят.

Все там прокатит. Опиши задачу, и я сделаю.

danik.js 03.12.2014 19:58

Все твои примеры годятся только на хелло ворлд

krutoy 03.12.2014 20:01

Цитата:

Сообщение от danik.js
годятся только на хелло ворлд

Они годятся на что угодно. Я смотрю, ты замыкания н осилил, поэтому и ноешь.

danik.js 03.12.2014 20:05

Наследование. Instanceof. Работоспособность оптимизаций js движков. Пока все. Жду

krutoy 03.12.2014 22:03

danik.js,
В такой вот, простой реализации тебя что не устраивает?
Class=function(){
   var private
   this.get=function(){alert(private)}
   this.set=function(newValue){private=newValue}
}

o1 = new Class
o2 = new Class

o1.set(1)
o2.set(10)
o1.get()
o2.get()

? То что каждый экземпляр имеет свои собственные методы? За память беспокоишься? Не думаю, что в большинстве случаев это будет иметь значение. Память нынче дешевая.
Что касается оптимизаций, то тут как раз наоборот. Движок любит лексические замыкания, там ссылочная прозрачность. Статика ё-ная.

nerv_ 03.12.2014 23:14

Цитата:

Сообщение от tsigel
К тому же я пишу на TypeScript

забавно, но именно на TS я так писал :)
https://yadi.sk/i/xZaFpF6cd8fqN

Сейчас не могу тебе сказать зачем оно нужно, в проекте несколько человек. Но эту часть с js на ts переписывал именно я)

tsigel 04.12.2014 00:31

nerv_,
а, да, Вы правы. TS дает имена классам. но кроме как для логирования я не вижу этому применения.

danik.js 04.12.2014 05:24

krutoy, а наследоваться как?

krutoy 04.12.2014 08:51

Цитата:

Сообщение от danik.js
а наследоваться как?

Как обычно, какие проблемы? Приватные доступны через собственные методы.
Class=function(){
   var private
   this.get=function(){return private}
   this.set=function(newValue){private=newValue}
}
Class.prototype.inc=function(){
   this.set(this.get()+1)
}
 
o1 = new Class
o2 = new Class
 
o1.set(1)
o2.set(10)
o1.inc()
o1.inc()
o2.inc()
alert(o1.get())
alert(o2.get())

kostyanet 04.12.2014 12:55

На js дубовые геттеры оказывается, для каждой переменной нужен свой собственный. То есть эти get и set фактически ничем от вручную прописанных как у крутого не отличаются. Я уже в который раз подозреваю что не нужен ява-скрипту ООП.

tsigel 04.12.2014 13:09

kostyanet,
Нужен, вы просто не умеете им пользоваться.

kostyanet 04.12.2014 13:13

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

kostyanet 04.12.2014 13:23

Кстати тема, то есть subj, просто оксюморон. Как граматно создать...

tsigel 04.12.2014 13:27

var FormField = function FormField(elem){
	this.type = elem.type;
	this.def = elem.value;
	this.rules = {};		
};

FormField.prototype.validate = function() {
	value=elem.value.trim();
	if(this.type in rules) {
	  rules[type]();
	} else {
          rules.text();
	}
};

var some = new FormField(elem);


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

devote 04.12.2014 19:17

Цитата:

Сообщение от krutoy
Приватные доступны через собственные методы.

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

devote 04.12.2014 19:22

Цитата:

Сообщение от tsigel
value=elem.value.trim();

А что перед переменными оператор var уже не нужен? Вы если примеры от пользователя krutoy берете, не забывайте о том что в них полно недочетов.

krutoy 04.12.2014 19:37

Цитата:

Сообщение от devote
если любой может изменить приватные значения

Что значит любой. Изменить может только конкретный экземпляр, хозяин своей персональной переменной.

devote 04.12.2014 19:40

Цитата:

Сообщение от krutoy
хозяин своей персональной переменной.

Ну значит наследование в пролете..

krutoy 04.12.2014 19:41

devote,
Откройте глаза:) Там показано наследование. Или вы какую-то конкретную фичу имеете в виду. Поясните. Вы хотите чтобы приватная переменная наследовалась, или чо? тогда какая она нахер приватная.

devote 04.12.2014 20:01

Цитата:

Сообщение от krutoy
Откройте глаза Там показано наследование.

ты не понял, у тебя наследование это создание методов в прототипе, но методы прототипа не видят приватную переменную... Что бы ее получить ты создал методы set/get что уже открывает переменную наружу... А вот нужно сделать так, что бы методы в прототипе тоже могли получать доступ к приватным значениям, но при этом что бы к ним не было доступа снаружи. Без всяких там методов get/set

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

krutoy 04.12.2014 20:09

Цитата:

Сообщение от devote
что уже открывает переменную наружу

Каким образом?

devote 04.12.2014 20:20

Цитата:

Сообщение от krutoy
Каким образом?

неужели совсем не очевидно?
// это твой класс, как бы с приватными переменными
var instance = new YourClass;

// а вот что я делаю с экземпляром твоего класса

// теперь приватную переменную я буду хранить тут, вытащил наружу
var private = instance.get();
// переопределяем метод получения значения
instance.get = function() {return private;}
// переопределяем метод установки значения
instance.set = function(value) {private = value;}
Теперь видно что вся работа с переменной проходит через переопределенные методы, а это значит что приватности тут ноль... Ибо я могу легко сломать функционал класса.

krutoy 04.12.2014 20:24

Цитата:

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

ЯННП. Это тогда будет приватная переменная для класса, а не для экземпляров, или как? Если это надо, думаю, такое тоже можно реализовать. Но даник хотел именно это изначально, поэтому я сделал, то что он хотел, а приватная для класса -- это уже другой вопрос.

krutoy 04.12.2014 20:28

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

krutoy 04.12.2014 20:31

devote,
И нахрен вообще нужен этот гемор, мы что, в шпионов играем чтоли?

devote 04.12.2014 20:36

Цитата:

Сообщение от krutoy
Никто не говорил, что методы будут приватными, об этом речь не шла.

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

krutoy 04.12.2014 21:01

Цитата:

Сообщение от devote
Я думаю об этом и говорилось выше.

Нет не об этом. Вот с этого ветка началась.

http://javascript.ru/forum/misc/5208...tml#post344241

tsigel 04.12.2014 23:05

Цитата:

Сообщение от devote
Цитата:

Сообщение от tsigel
Сообщение от tsigel
value=elem.value.trim();

А что перед переменными оператор var уже не нужен? Вы если примеры от пользователя krutoy берете, не забывайте о том что в них полно недочетов.

Не, это я просто случайно. Примеры от krutoy я никогда не использую. Восновном он пишет ересь, матерится и сливается когда доходит до конструктива. Или говорит что имел в виду совсем другое.

krutoy 04.12.2014 23:07

Цитата:

Сообщение от tsigel
сливается когда доходит до конструктива

Пример слива в студию

tsigel 04.12.2014 23:14

krutoy,
ну например тема про мерж нескольких объектов.

Или я на днях читал твою перепалку с bes. Не помню в какой теме, но ты написал что он не прав а тебе некогда. И больше не писал туда)

tsigel 04.12.2014 23:23

krutoy,
значит с тем что ты пишешь ересь и материшся - ты согласен, тебя тока слив задел?)))

krutoy 04.12.2014 23:32

tsigel,
Там не было никаких сливов, просто ты ни*янепонел. С бесом, там вообще ЕМНИП, про expressions было. У меня не было желания штудировать кучу х*ты, чтобы "найти" ответ на элементарнейший вопрос. Я не собираюсь кого-то в чем то убеждать.

tsigel 04.12.2014 23:32

krutoy,
ну-ну

krutoy 04.12.2014 23:40

tsigel,
Ты вот скажи, ты, например, сейчас до варов моих дое*лся. Ты можешь сказать, внятно, без шелухи и отмазок, зачем нужны вары в глобальной области, за исключением ноды и ее модулей. Какой смысл с точки зрения семантики имеют? Вангую твой очередной слив.

tsigel 04.12.2014 23:45

Цитата:

Сообщение от krutoy
tsigel,
Ты вот скажи, ты, например, сейчас до варов моих дое*лся. Ты можешь сказать, внятно, без шелухи и отмазок, зачем нужны вары в глобальной области, за исключением ноды и ее модулей. Какой смысл с точки зрения семантики имеют? Вангую твой очередной слив.

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

Типа тебя :)

И ещё ты всевремя редактируешь свои записи. Это тоже раздражает. Ладно бы ты ошибки синтаксические/грамматические правил. Тыж переписываешь почти.

krutoy 04.12.2014 23:46

tsigel,
иными словами ты не знаешь?


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