Создание конструктора ("класса")
Стандартный способ, самый простой и понятный.
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 }); |
Мб назвать не new_class, а newСlass?
И не newTemplet, а newTemplate? :) |
B~Vladi, спасиб поправлю на newTemplate.
а вот newСlass мне както не нравиться внешне как выглядит. какбы сливается и неприметным становиться. |
Ну ты уж определись с наименованием переменных. Один стиль - хороший тон.
|
всегда есть исключения)
|
Не тот случай, имхо. А вообще в JS нет классов, так что лучше придумай этому другое название :)
|
так я и написал "класс".
|
А для чего такое бывает нужно в природе? Ну, там, иерархическое меню, или сортировка таблицы, или скрыть-отобразить сноски, или валидация формы?.. Можете показать какие-нибудь рабочие примеры?
|
Цитата:
|
а тут на форуме нет, чтобы в закладки себе бросить, или в памятку какую? А то у меня уже путаница неимоверная в ссылках ...
Пробовал "подписаться на тему", но что то это не то. |
Цитата:
Ну, и всё-таки, наверное, /dev/examples/ != "в природе". |
Там используется Ext-овский конструктор "класса".
Цитата:
|
stopkran, в Extjs есть Ext.extend(), она тоже создает конструктор("класс"). http://dev.sencha.com/deploy/dev/doc...hod-Ext-extend . но правда от их кода у меня крышу сносит, и по функциональности меня не устраивает.
|
Цитата:
Вот на том же dev.sencha.com, на приведённой вами странице есть используемый и необходимый в природе код js - синтаксической подсветки. Он приносит совершенно очевидную пользу: уменьшает объём страницы (позволяет вставлять описываемый код на страницу "как есть"). Какую пользу и на какой странице приносит код Ext.extend()? Хотя причём он тут вообще... Вопрос изначально был "где в природе используется ваш "конструктор класса""? Ну вот, допустим, написал я скрипт валидации формы и использую его на своём сайте ir2.ru (блин, нет, оказывается ни хрена не использую! ну, спасибо за подсказку, займусь этим в выходные). А вы где, на каком сайте используете? |
Цитата:
/dev/examples/ === "zoopark", стопудово "В природе" = {Яндекс, cirota.ru/forum, rutracker.org, alljs.ru/articles/... наконец, какой-нибудь belttrade.ru или dbmodern.ru} |
stopkran,
sencha используется в сотнях реальных проектов. Не можете самостоятельно найти -- ваши проблемы. В любом случае, если вы никогда не писали крупных проектов, это не повод показывать своё невежество и кричать, а нафиг нужен этот ваш extend. Для реюзабельности кода он нужен. |
Цитата:
Кстати а проект WebVisor на каких технологиях завязан (Node, Ext и тд.), или просто JS+PHP? |
Цитата:
Цитата:
|
Мне кажется вы забыли еще ActionScript указать:)
А почему именно ExtJS? Расскажите пожалуйста вкратце о его преимуществах на этом проекте и есть ли они вообще. |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
обьект можно создать так: {xxx: 2222, eeee: function(){}, ... итд}
но если нужно таких обьектов много (1, 5, 10, ...) то проше воспользоваться конструктором(функция которая вернет "болванку") конструктор(класс) нужен для создания обьекта определенной структуры. Есть там наследование или нет это уже дело десятое. в идеале нужно делать свой оператор new, чтота вроде: var myclass = {constructor:fun.., ...}; var obj = new_(myclass ).Но это медлено, потому и танцы с бубном вокруг нативного new function(){} |
Цитата:
Цитата:
Могу посоветовать лишь, для каждого класса Ext-а создавать свой наследующий класс, от которого уже создавать объекты или наследовать свои прикладные классы. В результате, когда внезапно понадобится добавить во все окошки приложения какую-нибудь свистелку, отредактируется только один файл. |
Цитата:
|
Kolyaj, это мое видения. что класс это обьект, который как шаблон для конструктора new. сейчас шаблон это функция , а хотелось бы чтоб был простой обьект.
|
Цитата:
|
Kolyaj, попробуйте создать два класса чтобы функция(ну вы поняли какая) у них была одна ита-же, а прототипы разные.
|
И что это доказывает?
|
Цитата:
Цитата:
|
Цитата:
А собственный оператор new кроссбраузерно не создать. |
Высосано из пальца:yes:
|
Людям мешают ООП и поддержка xml в php. Люди жаждут классов в прототипном javascript. Люди используют jQuery, чтобы расположить текст в три колонки.
Я начинаю задумываться о смене веры и уходе в |
люди хватит флудить
|
Цитата:
|
stopkran, у меня есть терпение но нет желания объяснять зачем нужны конструкторы(классы)
|
Цитата:
|
Цитата:
|
какая разница?
А вообще, тебе не нужно ООП, даже не пробуй ;) |
Часовой пояс GMT +3, время: 04:22. |