Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание прототипа (https://javascript.ru/forum/misc/62301-sozdanie-prototipa.html)

DivMan 03.04.2016 22:19

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

https://jsfiddle.net/e89zj0zj/

protoquest 03.04.2016 22:34

DivMan,
ты обдолбанный чтоли пишешь? для ООП, они, для проектирования

protoquest 03.04.2016 22:56

function Car(model, color){
  this.model = model;
  this.color = color;
}
Car.prototype = {
  recolor: function(newColor) {this.color = newColor},
  priceOrDefault: function(){return this.price ? this.price : 10000}
}


Object.defineProperty(Car.prototype, "all", {get: function(){ return this.model + " " + this.color} })

var car1 = new Car("BMW ", "Black");
var car2 = new Car("Lada ", "Blue")

car2.price = " 700 000 RUB"

console.log( car1.all, car2.all)
car1.recolor("silver")
console.log( car1.all, car2.all)
console.log(car1.priceOrDefault(), car2.priceOrDefault())

DivMan 08.04.2016 14:07

Почему в консоле не отображается созданное свойство?

function User(name, age){
this.name = name;
this.age = age;
this. admin = false;
}

var u1 = new User("Vasya", 22);

User.prototype.x = 10;

u1




должно быть так: User {name: "Vasya", age: 22, admin: false, x: 10}

DivMan 08.04.2016 18:35

Почему не удаляется прототип?

var F = function () {
this.a = 1;
}

var f = new F();

F.prototype.a = 44

f.a = 33

delete f.a

delete f.a

delete f.a

рони 08.04.2016 18:37

DivMan,
троль?

DivMan 08.04.2016 18:46

нет, почему он не удаляется?

DivMan 08.04.2016 18:50

Я кажись начинаю понимать

Decode 09.04.2016 00:30

Цитата:

Сообщение от DivMan (Сообщение 413598)
Почему не удаляется прототип?

var F = function () {
this.a = 1;
}

var f = new F();

F.prototype.a = 44

f.a = 33

delete f.a

delete f.a

delete f.a

3 раза delete f.a - мало. Надо 100.

DivMan 09.04.2016 20:15

Цитата:

Сообщение от Decode (Сообщение 413616)
3 раза delete f.a - мало. Надо 100.

Циклом? :lol:

Cache 14.04.2016 15:39

Цитата:

Сообщение от DivMan
Циклом?

да, бесконечным
for(;;){delete f.a;};

ruslan_mart 14.04.2016 20:43

Cache, тут на самом деле одного бесконечного цикла мало будет. Как минимум, два, и рекурсию:

while(1) delete f.a;
for(;;) delete f.a;

function deleteFA() {
    delete f.a;
    deleteFA()
};
deleteFA();

Cache 15.04.2016 00:36

Ruslan_xDD,
два цикла + рекурсия, эт хорошо, но не в таком же виде, у вас же 95% кода, просто простаивает
тут как минимум, надо параллельными потоками запускать

Decode 15.04.2016 01:38

:D :D :D

DivMan 14.08.2016 12:00

Почему ResetableCounter is not defined?

function Counter(init){
	this.init = init;
	this.counter = init;
}

Counter.prototype.inc = function(){
		this.counter++
}

ResetableCounter.prototype = Object.create(Counter.prototype)

ResetableCounter.prototype.reset = function(){
	this.counter = this.init
}

let c = new ResetableCounter(100)
c.inc()
c.inc()

warren buffet 15.08.2016 13:26

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

DivMan 15.08.2016 22:18

Почему опять undefined? Я хочу создать объект 'o', такой же, как и объект 'obj', только с помощью конструктора

https://jsfiddle.net/3c7ahtrv/

warren buffet 15.08.2016 22:23

Так надо добавить return сюда

this.setName2 = function (name) {
	this.name = name;
	return 'Какую траву ты куришь '+name+'?';
};


И тогда

console.log(o.setName2('vova'));

с тобой заговорит на твоем языке. Зацени https://jsfiddle.net/3c7ahtrv/1/

warren buffet 15.08.2016 22:28

Цитата:

Сообщение от DivMan
Я хочу создать объект 'o', такой же, как и объект 'obj',

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

DivMan 16.08.2016 11:18

Как интерпретатор находит функцию getName в __proto_, если её там нету? Она находится не в __proto_ а в конструкторе

https://jsfiddle.net/mq6ubzem/

http://i77.fastpic.ru/big/2016/0816/...c92037b9ac.jpg

warren buffet 16.08.2016 13:58

А он и не находит если не курит ту же самую траву https://jsfiddle.net/mq6ubzem/1/

warren buffet 16.08.2016 14:17

DivMan, прекращай фигней страдать, уже не смешно.

Функция - это подпрограмма, то есть кусок кода лежащий ВНЕ пути следования процессора. Представь себе дорогу - по ней едет телега - это процессор, а по бокам дороги деревни и села и бордели. Если не сворачивать - так и проедешь не увидав ни одной телки, а если свернуть в заведение - то окажешься внутри заведения и там будут телки. Когда ты заходишь в заведение тебя регистрируют - ДивМэн, приехал в 21:34, один, без халата. Когда выходишь из заведения - тебя снимают с регистрации: ДивМэн, 8:12, взял с собой халат. Сколько ты там поимел телок - никому кроме заведения не известно. Это и называется - подпрограмма. То есть кусок кода на адрес которого процессор посылается специальной командой, выполняет коды с этого адреса, доходит до команды возврата на трассу и возвращается на следующий после вызова подпрограммы адрес.

Функция - это подпрограмма и более ничего. Это помещение со своими стенами и барахлом внутри. Это полная изоляция своего барахла от внешнего мира в своем собственном адресном пространстве. В некоторых языках так устроены не только функции, но и конструкции вроде if(), for(), где все что объявлено внутри () оказывается внутри стен помещения.

То есть смотри, на дороге общего пользования проходящей мимо борделей у нас все публичное, а внутри помещений - частное, или приватное. Есть еще одна разновидность формы собственности - защищенная, это все барахло лежащее во дворе помещения, то есть не внутри и не на дороге. Но в жабе protected явно не объявляется.

И вот возникает задача как-то получить частное из функции ДО завершения ее работы, в любой произвольный момент так сказать. Для этого и придумана такая форма функции как класс или его рабочая копия - объект.

Когда ты внутри функции пишешь this.name = 'Вася'; то значит хочешь сделать так, чтобы можно было получить из ее значение частной переменной name, положить в грузовик и увезти по дороге в другое помещение. Не саму переменную, а ее значение, то есть груз.

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

Прекращай выдумывать собственную реальность и не кури траву.

DivMan 16.08.2016 15:14

Да я реально не понимаю

DivMan 16.08.2016 15:15

А вот это нормальный код для калькулятора?
https://jsfiddle.net/yhvguf9o/

DivMan 16.08.2016 17:41

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

https://jsfiddle.net/vrbse5qg/2/

warren buffet 16.08.2016 18:37

Если ты хочешь сделать калькулятор, который будет считать выражения вроде 3+5-(sqr(3)-lg(4))/2.56*0.001 и так далее, тебе не нужна вся эта тряхомудия классического жанра. Тебе нужен токенизатор, то есть программа, которая разбирает любое математическое выражение или форумул на токены и вычисляет токены и выдает результат. В сущности у любого парсера в том числе такого языка как жаба на фронтире токенизатор.

warren buffet 16.08.2016 18:50

Цитата:

Сообщение от DivMan
почему

Потому что ты задолбал. Какие нахрен тебе нужны прототипы вообще? Кто тебя надоумил этой хренью заниматься? Я написал тысячи строк кода на жабе и ни разу не написал .prototype

Попробуй разъяснить за каким членом корреспондентом ты рисуешь эти бредовые конструкции.

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

var Foo = function(){};

Foo.name =  null;

if(bar)
   Foo.setName=function(name){
      this.name=bar+' '+name; 
   };
else
  Foo.name=function(){
    this.name=name;
  };


Все то же самое можно сделать внутри самой функции используя this, вот реальный пример

if(history.pushState)

	this.run=function(e){

		if(!e || !e.target) return;
		
		var p,el=e.target,url=el.href;
		
		if(!url) {
		
			if((el=el.closest('[data-id]')) 
				&& (p=el.querySelector('a[href]')))	url=p.href;
				
			else return;
		
		}
		
		if(el.closest('main')) le=el;
		
		stoPe(e);
		ajax(url,set_page);

	};
	
else
	this.run=function(e){
		cOpen(e.target,opts.tmb_css);
	};


Прекращай галиматью постить, над тобой же смеются.

DivMan 16.08.2016 20:28

Это мне надо делать, для того, что бы понять прототипы

warren buffet 16.08.2016 20:44

Кстати я тут пропустил эти самые прототипы

Foo.setName=function(name){ - так нельзя, надо

Foo.prototype.setName=function(name){

Цитата:

Сообщение от DivMan
что бы понять прототипы

Просто подожди еще немного пока ECMA6 устаканится и не придется этой галиматьи понимать. Там уже есть классы и наследование и конструкторы и доступ к родителю.

warren buffet 16.08.2016 20:49

Цитата:

Сообщение от DivMan
что бы понять прототипы

Для практики можешь понимать так. Там где внутри функции this, там снаружи в дизайн-тайм - prototype.

Прототипирование - это ниточка с бусами, ну, цепочка, оно так и называется prototype chain. Просто выделили проперть с зарезервированным именем для связи между объектами и протащились.

А в классах наследование - это метафора наложения одного чертежа на другой чертеж. Ну или как в мультипликации наложение одного целлулоида на другой.

warren buffet 16.08.2016 20:52

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

warren buffet 16.08.2016 21:01

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

DivMan 16.08.2016 21:05

но эти же классы работают по принципу прототипов?

warren buffet 16.08.2016 21:18

Нет. Прототип - это дерево наподобие папок в твоем компе. Когда в этой папке нет искомого файла, ОС пытается искать его в следующей папке, если в ней нет - в следующей и так пока папки не кончатся или файл будет найден. Функции как объекты в жабе тоже не чертежи, поскольку создавать из них экземпляр не требуется. А класс - это чертеж. Сам по себе это просто код, который нельзя запустить как объект, сперва надо сделать из него объект. И в этом вся мякотка, что ты можешь модифицировать чертежи ДО того, как из них будут произведены объекты, а прототипирование работает только с живыми объектами.

DivMan 16.08.2016 21:22

возьми меня в ученики

warren buffet 16.08.2016 21:24

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

warren buffet 16.08.2016 21:25

DivMan, ты с форума переключись на местную документацию, там русским языком все написано и получше наверно чем я тут калякаю.

warren buffet 16.08.2016 21:32

Почитал что там пишут. Когда-то это было интересным, но теперь инфа уже серьезно устарела, в частности __proto__ этот уже считается юзать некомильфо, типа колхозный стайл. Но ты можешь вот тут почитать о плюсах и минусах https://learn.javascript.ru/classes

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

DivMan и вообще. Первое, что надо понять в отношении ООП вообще - зачем оно нужно и всякий раз приступая к реализации какой-то фичи понимать, нужны тут объекты, прототипы или может быть понадобятся или легко обойтись функцией с несколькими функциями внутри.

DivMan 16.08.2016 21:35

А можно ли вообще обойтись без ООП, в сложных проектах?

warren buffet 17.08.2016 09:51

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

Ты бы пописал в Си или в хотя бы Бейсике, сразу бы полюбил Жабу навеки. )))


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