Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Создание конструктора ("класса") (https://javascript.ru/forum/project/12754-sozdanie-konstruktora-klassa.html)

vflash 01.11.2010 19:08

Создание конструктора ("класса")
 
Стандартный способ, самый простой и понятный.
var clssX = function() {
	alert(this.text); // show "Text"
	};

clssX.prototype.text = 'Text';
var objX = new clssX();


мой конструктор класса.

var rr = {
	new_class: function() {
		var oc = Object.prototype.constructor;
		function cn(){}; // null constructor

		function clss(c) {
			return function(a1,a2,a3) {
				var x = c.parent, l, m, u;

				if (typeof x === 'function') {
					x.apply(this, arguments);
					};

				if (c.factory) {
					switch(l = arguments.length){ // for fast
						case 0: x = c.factory(this); break;
						case 1: x = c.factory(this, a1); break;
						case 2: x = c.factory(this, a1, a2); break;
						case 3: x = c.factory(this, a1, a2, a3); break;

						default:
							for(m = [this]; x = l--;) m[x] = arguments[l];
							x = c.factory.apply(c, m);
						};

					if (x !== u) return x;
					};
				}
			};


		return function(c) {
			if (c) {
				var p = c.parent, i, s, u;

				if (p = p && p.prototype) {
					cn.prototype = p;
					p = new cn;

					if (s = c.prototype) {
						for(i in s) if (s[i] !== u) p[i] = s[i];
						c.prototype = p;
						};
					};

				s = c.constructor;
				if (!s || s === oc) s = clss(c);

				if (p = c.prototype) s.prototype = p;

				if (i = c.interface) s.prototype[i === true ? 'interface' : i] = c;
				s.interface = c;

				return s;
				}
			}
		}(),


	newTemplate: function() {
		var c = function(){}, cp = c.prototype, ie=!(function(i) {for(i in {constructor:1}) return 1})(), s = !{}.__proto__;

		return function(p) {
			c.prototype = p || cp;
			var x = new c, l = arguments.length, i = 1, n, e;
			if (!s) {x.__proto__ = p; c.prototype = x; x = new c};

			while(i < l) {
				if (e = arguments[i++]) {
					for (n in e)
						if (e.hasOwnProperty(n))
							c[n] = e[n];

					if (ie && e.hasOwnProperty(n = 'constructor'))
						c[n] = e[n];
					};
				};

			return x;
			}
		}()
	};


пример как использую:

var clssA = rr.new_class({
	constructor: function() {
		alert(this.text); // show "Text"
		},

	prototype: {
		text: 'Text'
		}
	});


var clssB = rr.new_class({
	parent: clssA,
	constructor: function() {

		alert(this.text+': '+this.value); //show "Text: bla bla bla"
		},

	prototype: {
		value: 'bla bla bla'
		}
	});


var clssC = rr.new_class({
	factory: function(obj) {
		alert(obj.A + this.B); // show (20)
		},

	prototype: {
		A: 12
		},

	B: 8
	});


var clssD = rr.new_class({
	parent: clssA,
	factory: function(obj) {
		alert(obj.text +": "+obj.X); // show "Text: eeeeee ee ee"
		},

	 prototype: {
		X: "eeeeee ee ee"
		}
	});


var itE, clssE = rr.new_class(itE = {
	interface: true,
	constructor: function() {
		alert(this.interface.value); // show "test"
		},

	value: 'test'
	});

var clssF = rr.new_class(itE = {
	interface: 'obj_config',
	constructor: function() {
		alert(this.obj_config.value); // show "test"
		},

	value: 'test'
	});



var objA = new clssA(); // show "Text"
var objB = new clssB(); //show "Text: bla bla bla"
var objD = new clssC(); //show "Text" and show "Text: eeeeee ee ee"


alert(clssE.interface == itE); // show true


иногда нужно сразу создать обьект у которого определенный протатип:

var objN = rr.newTemplate(prot, {
	AAA: 1,
	BB: 2
	});

B~Vladi 01.11.2010 20:27

Мб назвать не new_class, а newСlass?
И не newTemplet, а newTemplate? :)

vflash 01.11.2010 21:56

B~Vladi, спасиб поправлю на newTemplate.
а вот newСlass мне както не нравиться внешне как выглядит. какбы сливается и неприметным становиться.

B~Vladi 01.11.2010 22:06

Ну ты уж определись с наименованием переменных. Один стиль - хороший тон.

vflash 01.11.2010 22:24

всегда есть исключения)

B~Vladi 02.11.2010 00:04

Не тот случай, имхо. А вообще в JS нет классов, так что лучше придумай этому другое название :)

vflash 02.11.2010 00:25

так я и написал "класс".

stopkran 02.11.2010 10:20

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

Kolyaj 02.11.2010 10:22

Цитата:

Сообщение от stopkran
Можете показать какие-нибудь рабочие примеры?

http://dev.sencha.com/deploy/dev/examples/

micscr 02.11.2010 11:05

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

stopkran 02.11.2010 11:39

Цитата:

Сообщение от Kolyaj (Сообщение 77001)

Посмотрел валидацию формы http://dev.sencha.com/deploy/dev/exa.../adv-vtypes.js, так и не понял, где там используется "мой конструктор класса" или даже "обычный конструктор класса".

Ну, и всё-таки, наверное, /dev/examples/ != "в природе".

Kolyaj 02.11.2010 11:43

Там используется Ext-овский конструктор "класса".

Цитата:

Сообщение от stopkran
Ну, и всё-таки, наверное, /dev/examples/ != "в природе".

Равно, равно.

vflash 02.11.2010 12:55

stopkran, в Extjs есть Ext.extend(), она тоже создает конструктор("класс"). http://dev.sencha.com/deploy/dev/doc...hod-Ext-extend . но правда от их кода у меня крышу сносит, и по функциональности меня не устраивает.

stopkran 03.11.2010 05:18

Цитата:

Сообщение от vflash
от их кода у меня крышу сносит

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

Вот на том же dev.sencha.com, на приведённой вами странице есть используемый и необходимый в природе код js - синтаксической подсветки. Он приносит совершенно очевидную пользу: уменьшает объём страницы (позволяет вставлять описываемый код на страницу "как есть").

Какую пользу и на какой странице приносит код Ext.extend()? Хотя причём он тут вообще... Вопрос изначально был "где в природе используется ваш "конструктор класса""? Ну вот, допустим, написал я скрипт валидации формы и использую его на своём сайте ir2.ru (блин, нет, оказывается ни хрена не использую! ну, спасибо за подсказку, займусь этим в выходные). А вы где, на каком сайте используете?

stopkran 03.11.2010 05:29

Цитата:

Сообщение от Kolyaj (Сообщение 77010)
Равно, равно.

Ну, с некоторой натяжкой, соглашусь с /dev/ == "in nature"

/dev/examples/ === "zoopark", стопудово

"В природе" = {Яндекс, cirota.ru/forum, rutracker.org, alljs.ru/articles/... наконец, какой-нибудь belttrade.ru или dbmodern.ru}

Kolyaj 03.11.2010 08:14

stopkran,
sencha используется в сотнях реальных проектов. Не можете самостоятельно найти -- ваши проблемы.

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

monolithed 03.11.2010 11:25

Цитата:

Сообщение от Kolyaj
В любом случае, если вы никогда не писали крупных проектов, это не повод показывать своё невежество и кричать, а нафиг нужен этот ваш extend.

Думаю, что не всегда крупный проект подразумевает использование sencha.
Кстати а проект WebVisor на каких технологиях завязан (Node, Ext и тд.), или просто JS+PHP?

Kolyaj 03.11.2010 11:29

Цитата:

Сообщение от monolithed
Думаю, что не всегда крупный проект подразумевает использование sencha.

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

Цитата:

Сообщение от monolithed
Кстати а проект WebVisor на каких технологиях завязан (Node, Ext и тд.), или просто JS+PHP?

Сервер -- Java, клиент -- ExtJS, счётчик -- pure JavaScript. Счётчик, кстати, сделан без объектов вообще для лучшей сжимаемости.

monolithed 03.11.2010 12:10

Мне кажется вы забыли еще ActionScript указать:)

А почему именно ExtJS? Расскажите пожалуйста вкратце о его преимуществах на этом проекте и есть ли они вообще.

Kolyaj 03.11.2010 12:29

Цитата:

Сообщение от monolithed
Мне кажется вы забыли еще ActionScript указать

Где?

Цитата:

Сообщение от monolithed
А почему именно ExtJS? Расскажите пожалуйста вкратце о его преимуществах на этом проекте и есть ли они вообще.

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

monolithed 03.11.2010 13:20

Цитата:

Сообщение от Kolyaj
Где?

Воспроизведение событий на флеше, разве нет?))

Цитата:

Сообщение от Kolyaj
В данный момент Ext уже больше мешает, нежели помогает.

А можно пожалуйста по подробней (а то я думаю сейчас выбрать его в качестве основного фреймворка для одного из проектов и очень интересно узнать о подводных камнях)

vflash 03.11.2010 13:24

обьект можно создать так: {xxx: 2222, eeee: function(){}, ... итд}
но если нужно таких обьектов много (1, 5, 10, ...) то проше воспользоваться конструктором(функция которая вернет "болванку")

конструктор(класс) нужен для создания обьекта определенной структуры. Есть там наследование или нет это уже дело десятое.

в идеале нужно делать свой оператор new, чтота вроде:
var myclass = {constructor:fun.., ...};
var obj = new_(myclass ).
Но это медлено, потому и танцы с бубном вокруг нативного new function(){}

Kolyaj 03.11.2010 13:28

Цитата:

Сообщение от monolithed
Воспроизведение событий на флеше, разве нет?))

Нет, всё на HTML+JavaScript.

Цитата:

Сообщение от monolithed
А можно пожалуйста по подробней

Ну так я говорю, это не проблема Ext'-а, как такового. Ext сам по себе очень продуманный фреймворк. Это проблема любого фреймворка. Просто на первом этапе нужно сделать как можно быстрей интерфейс, окошки там, кнопочки, гриды. И всё прекрасно. А потом уже появляются требования тут специфическую свистелку прикрутить, там прикрутить. Для этого расширяем классы фреймворка, в результате от классов фреймворка остаются лишь названия, а сам фреймворк следует на проектом мёртвым грузом. Но это уж совсем последняя стадия :)

Могу посоветовать лишь, для каждого класса Ext-а создавать свой наследующий класс, от которого уже создавать объекты или наследовать свои прикладные классы. В результате, когда внезапно понадобится добавить во все окошки приложения какую-нибудь свистелку, отредактируется только один файл.

Kolyaj 03.11.2010 13:29

Цитата:

Сообщение от vflash
в идеале нужно делать свой оператор new, чтота вроде:

Это что за идеал такой?

vflash 03.11.2010 13:57

Kolyaj, это мое видения. что класс это обьект, который как шаблон для конструктора new. сейчас шаблон это функция , а хотелось бы чтоб был простой обьект.

Kolyaj 03.11.2010 14:24

Цитата:

Сообщение от vflash
сейчас шаблон это функция , а хотелось бы чтоб был простой обьект.

Сейчас шаблон это объект, а функция только создаёт объект и связывает его с объектом шаблоном.

vflash 03.11.2010 14:39

Kolyaj, попробуйте создать два класса чтобы функция(ну вы поняли какая) у них была одна ита-же, а прототипы разные.

Kolyaj 03.11.2010 14:41

И что это доказывает?

vflash 03.11.2010 15:09

Цитата:

Сообщение от Kolyaj (Сообщение 77242)
....., а функция только создаёт объект и связывает его с объектом шаблоном.

обьект с прототипом "функция.prototype" создает оператор new. и только потом выполняет функцию в контексте созданного обьекта.

Цитата:

И что это доказывает?
это был пример того что нельзя сделать стандартными средствами (те оператором new).

Kolyaj 03.11.2010 15:22

Цитата:

Сообщение от vflash
это был пример того что нельзя сделать стандартными средствами (те оператором new).

А зачем это надо?

А собственный оператор new кроссбраузерно не создать.

B~Vladi 03.11.2010 15:35

Высосано из пальца:yes:

subzey 03.11.2010 18:18

Людям мешают ООП и поддержка xml в php. Люди жаждут классов в прототипном javascript. Люди используют jQuery, чтобы расположить текст в три колонки.
Я начинаю задумываться о смене веры и уходе в буддизм python.

vflash 03.11.2010 18:40

люди хватит флудить

stopkran 08.11.2010 11:00

Цитата:

Сообщение от vflash
но если нужно таких обьектов много (1, 5, 10, ...)

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

vflash 08.11.2010 12:33

stopkran, у меня есть терпение но нет желания объяснять зачем нужны конструкторы(классы)

x-yuri 09.11.2010 03:49

Цитата:

Сообщение от stopkran
но я всё-таки не могу понять, зачем нужно много объектов

ну вот на этой страничке сколько кнопок Цитата? Много. Потому и объектов нужно... сколько? Правильно, много ;)

stopkran 04.12.2010 12:42

Цитата:

Сообщение от x-yuri
ну вот на этой страничке сколько кнопок Цитата?

разве кнопки Цитата на этой страничке создаются с помощью javascript? По-моему, браузер их получает с сервера в готовом (HTML) виде.

x-yuri 04.12.2010 22:41

какая разница?
А вообще, тебе не нужно ООП, даже не пробуй ;)


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