Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Приветствую. Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js :) Я сейчас использую вот такой синтаксис: //обьявления "класса" function SuperClass(parameter) { this._construct(parameter); } (function() { SuperClass.prototype = { property : null, staticProperty : new SuperClass("Tram pam pam"), _construct : function(parameter) { this.property = parameter; }, someMethod : function(args) { //todo } } })(); //использование var sclass = new SuperClass("Xmm"); sclass.property = "Xmm2"; sclass.someMethod();... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 17:37 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
наиболее оптимальным вторую часть скрипта: SuperClass = function() { this._construct(arguments); } SuperClass.prototype = { property : null, staticProperty : new SuperClass("Tram pam pam"), _construct : function(a, b) { this.property = a+b; }, someMethod : function(args) { //todo } } извращение вокруг него со скобками и функцией мне совершенно непонятно. Кстати очень советую ознакомиться с библиотекой prototype.js http://ln.com.ua/~openxs/articles/smart-questions-ru.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 18:30 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
обязательно советую прочитать http://]http://www.crockford.com/#javascript Сразу поймёшь,что это такое Слева там будет список всех его статей , советую прочитать, причём все)) Краткое содержание: ООП в javascript, private,public,privileged, classic inheritance,parasitice inheritance,multiple inheritance Кроме того, советую разобраться с NameSpace, в js они тоже есть, но только для тех,кто внимательно прочитал. Ну а если хочешь узнать все скрытые возможности, то ключевое слово: BeyondJS. На джава скрипте можно сделать очень многое, на то чтобы осилить вышеприведённый материал потребуется от нескольких дней до недели, но результат будет того стоить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 20:00 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Добрый день! Как-то раньше не задумывался над этой проблемой, но когда эти скриптовый файлы начинают занимать по несколько сотен строчек кода, а код писал год назад. То просто уйму времени тратишь чтобы разобраться в том что уже написал. Так же хочется все это дело систематизировать... А есть что почитать, про это на русском языке и чтобы было с самых азов. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 06:14 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
http://dklab.ru/chicken/nablas/40.html а потом еще пару следующих "набл" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 10:15 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Приветствую. D>Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js :) D>Я сейчас использую вот такой синтаксис: а я так. var MyClass = Class( //Base class BaseClass, //Constructor function( a, b ) { base.constructor.call( this ); this.a = a; this.b = b; }, //Implementation function() { this.someMethod = function( a ) { // call method from base class; return base.someMethod.call( this, a ); } this.callPrivate = function() { // call private method privateMethod.call( this ); } // private method var privateMethod = function() { return this.a + this.b; } } ); использование var obj = new MyClass( 1, 2 ); obj.someMethod(); obj.callPrivate(); // вернет 1+2 переданные в конструкторе // obj.privateMethod(); - даст ошибку... << RSDN@Home 1.1.4 @@subversion >> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:06 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
О! Самое то. Как раз чтобы начать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:07 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, <Аноним>, Вы писали: А>http://dklab.ru/chicken/nablas/40.html А>а потом еще пару следующих "набл" :) спасибо за ссылку! узнал много нового :up:... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:31 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, _JoKe_, Вы писали: "сударь, да вы знаете толк в извращениях!" (с) :)) на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class :) щас попытаюсь сам придумать )... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:31 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Здравствуйте, _JoKe_, Вы писали: D>"сударь, да вы знаете толк в извращениях!" (с) :)) D>на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class :) D>щас попытаюсь сам придумать ) даже придумывать не надо, в статье http://dklab.ru/chicken/nablas/40.html все пишут :wow:... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:58 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Здравствуйте, <Аноним>, Вы писали: А>>http://dklab.ru/chicken/nablas/40.html А>>а потом еще пару следующих "набл" :) D>спасибо за ссылку! узнал много нового :up: пожалуйста :) я сам когда-то набрел туда с другой наблы — про JSHttpRequest, и был приятно удивлен столь подробной инфой про js :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 11:59 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Здравствуйте, _JoKe_, Вы писали: D>"сударь, да вы знаете толк в извращениях!" (с) :)) D>на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class :) D>щас попытаюсь сам придумать ) пожалуйста, мне не жалко, я уже в Веб программирование писал function Class(bc,c,i) { var l=function(){}; l.prototype=bc.prototype; var cc=c; cc.base=new l(); cc.prototype=new l(); i.call( cc.prototype ); cc.prototype.constructor=cc; return cc; }... << RSDN@Home 1.1.4 @@subversion >> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 12:59 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, _JoKe_, Вы писали: _JK>пожалуйста, мне не жалко, я уже в Веб программирование писал _JK> _JK>function Class(bc,c,i) _JK>{ _JK> var l=function(){}; _JK> l.prototype=bc.prototype; _JK> var cc=c; _JK> cc.base=new l(); _JK> cc.prototype=new l(); _JK> i.call( cc.prototype ); _JK> cc.prototype.constructor=cc; _JK> return cc; _JK>} _JK> спасибо! в вашем первом сообщении ошибка вроде в обращениях к базовому классу (base.constructor, а не MyClass.base.constructor) не могу понять одно различие в вашей реализации и реализации автора статьи function newClass(parent, prop) { // Dynamically create class constructor. var clazz = function() { // Stupid JS need exactly one "operator new" calling for parent // constructor just after class definition. if (clazz.preparing) return delete(clazz.preparing); // Call custom constructor. if (clazz.constr) { this.constructor = clazz; // we need it! clazz.constr.apply(this, arguments); } } clazz.prototype = {}; // no prototype by default if (parent) { parent.preparing = true; clazz.prototype = new parent; clazz.prototype.constructor = parent; clazz.constr = parent; // BY DEFAULT - parent constructor } if (prop) { var cname = "constructor"; for (var k in prop) { if (k != cname) clazz.prototype[k] = prop[k]; } if (prop[cname] && prop[cname] != Object) clazz.constr = prop[cname]; } return clazz; } основные пляски тут из-за того, что автор присваивает прототипу создаваемого конструктора новый обьект (clazz.prototype = new parent;) а вы его прототип (l.prototype=bc.prototype;) логичным и понятным кажется именно ваш код, но зачем автору понадобилось через new? он ещё в статье писал "Derive.prototype = new Base(); // без new нельзя!". А почему нельзя — не уточнил :) Может камень какой подводный есть :) не уловлю никак :(... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:05 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>спасибо! D>в вашем первом сообщении ошибка вроде в обращениях к базовому классу (base.constructor, а не MyClass.base.constructor) ага, виноват. D>не могу понять одно различие в вашей реализации и реализации автора статьи D> D>function newClass(parent, prop) { D> // Dynamically create class constructor. D> var clazz = function() { D> // Stupid JS need exactly one "operator new" calling for parent D> // constructor just after class definition. D> if (clazz.preparing) return delete(clazz.preparing); D> // Call custom constructor. D> if (clazz.constr) { D> this.constructor = clazz; // we need it! D> clazz.constr.apply(this, arguments); D> } D> } D> clazz.prototype = {}; // no prototype by default D> if (parent) { D> parent.preparing = true; D> clazz.prototype = new parent; D> clazz.prototype.constructor = parent; D> clazz.constr = parent; // BY DEFAULT - parent constructor D> } D> if (prop) { D> var cname = "constructor"; D> for (var k in prop) { D> if (k != cname) clazz.prototype[k] = prop[k]; D> } D> if (prop[cname] && prop[cname] != Object) D> clazz.constr = prop[cname]; D> } D> return clazz; D>} D> D>основные пляски тут из-за того, что автор присваивает прототипу создаваемого конструктора новый обьект (clazz.prototype = new parent;) а вы его прототип (l.prototype=bc.prototype;) D>логичным и понятным кажется именно ваш код, но зачем автору понадобилось через new? он ещё в статье писал "Derive.prototype = new Base(); // без new нельзя!". А почему нельзя — не уточнил :) D>Может камень какой подводный есть :) не уловлю никак :( финт моей реализации в том что я делаю промежуточный объект "l" и потом и в прототип и в ссылку на базововый делаю "new l()" (так что new у меня все равно есть, он нужен для того чтобы ссылки на прототипы развязать, если этого не зделать то при изменении прототипа нового класса будет изменятся прототип базового), к тому же поэтому конструктор базового класса при объявлении типа не вызывается, а в коде выше вся пляска вокруг preparing нужна только для того чтобы не вызывать базовый конструктор, это выглядит некрасиво , к тому же мне кажется правильней из наследуемого класса вызывать конструктор базового руками а не так как выше (автоматически), ведь может быть что аргументы при наследовании меняются и перед вызовом их надо скорректировать, переставить местами или еще чего... (в CPP он конечно автоматически вызывается но этот вызов можно корректировать, и здесь никак, поэтому мое решение — вызывать из конструктора насильно)... << RSDN@Home 1.1.4 @@subversion >> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 10:46 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Приветствую. D>Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js :) D>Я сейчас использую вот такой синтаксис: Вообще сейчас в работе я использую функциональный подход... хотя пишу исключительно на JavaScript, довольно большие и сложные приложения. По фичам JScript советую почитать здесь, для осознания МОЩИ JavaScript'а мне очень помогла статья про closures. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 11:50 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, ZeusTheTrueGod, Вы писали: спасибо за ссылки! буду изучать :user: пока самые полезные ссылочки по теме у меня вот эти: статья "Наследование в JavaScript" http://dklab.ru/chicken/nablas/40.html и обязательно обсуждение на форуме http://forum.dklab.ru/comments/nablas/40InheritanceInJavascript.html тема на рсдн в форуме "веб программирование" http://rsdn.ru/Forum/Message.aspx?mid=1647348#1647348 похоже ваша ссылка тоже сюда :) ну и спецификация ecma-262 может пригодится таким же как я в будущем :beer:... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 12:30 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>Приветствую. D>Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js :) D>Я сейчас использую вот такой синтаксис: Это хоть и принято только у нас, но я все таки активно пропагандирую такой подход: core.js.register_module( "components.webcontrols.client.test_class", function() { core.js.import_module( "core.js.build_class2" ); core.js.import_module( "core.lists.map" ); var ff = core.js.import_module( "core.lists.find_first" ); // using alias. var _class = core.js.build_class2( "components.webcontrols.client.test_class", function() { this.__base_classes__ = [ components.webcontrols.client.client.base_class ]; // наследование множественное this.__constructor__ = function( events ) { } function private_method( param ) { ff( core.lists.map( param, function (x){...} ), ), function (x){...} ); } this.methods.some_public_method = function ( param ) { //... } this.methods.override_sample (param) // перегрузка не требует никаки дополнительных операторов { base_class$override_sample( param ) // вызов бвзового метода } this.static_methods.some_static = function ( param ) { //.... } }); return { test_class: _class }; } ); Это несколько больше чем просто классы. Это модули. использование явных директив core.js.register_module , core.js.import_module , позволяет парсить js файлы на стороне сервера, и автоматически подключать все dependend модули. В примере выше на стороне сервера мы напишем: page_utils.include_module( "components.webcontrols.client.test_class" ); в отрендереный HTML при этом пойдет: <script scr="core/js/module.js" /> <script scr="core/js/build_class2.js" /> <script scr="core/lists/map.js" /> <script scr="core/lists/find_first.js" /> <script scr="components/webcontrols/client/base_class.js" /> <script scr="components/webcontrols/client/test_class.js" /> первые 5 скриптов подключаются автоматом. Подобные утилиты для такой "компиляции" можно написать на разных языках и для разных сред. в частности у нас есть утилита на Python'е, которая умеет генерировать — один большой собранный js файл. — wsf файл примерно такого содержания: ... <script language="JScript">var __file_name__ = "..\\..\\..\\..\\..\\core\\js\\module.js"</script><script language="JScript" src="..\..\..\..\..\core\js\module.js"></script> ... кроме того Модули могут вообще не содержать классов: /* (C) Copyright MetaCommunications, Inc. 2004. All rights reserved. */ core.js.register_module( "core.lists.map", function(){ function map( list, for_func, if_func ) { var mapped_list = [] for ( var i = 0; i < list.length; ++i ) { var x = list[i] if ( null == if_func || if_func( x ) ) mapped_list.push( for_func( x ) ) } return mapped_list; } function map_object( object, for_func, if_func ) { ... } function map_list( list, for_func, if_func ) { ... } function multi_map( list, key_func ) { ... } return { map: map , map_object: map_object , map_list: map_list , multi_map: multi_map }; } ) взять все это добро можно тут.... << RSDN@Home 1.1.4 beta 6a rev. 436>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:28 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, mogadanez, Вы писали: M> this.methods.override_sample (param) // перегрузка не требует никаки дополнительных операторов M> { M> base_class$override_sample( param ) // вызов бвзового метода M> } а конструкция с баксом это опечатка, или она потом транслируется в нужный код? А так все очень любопытно! :) жаль для моих целей точно избыточно... << RSDN@Home 1.1.4 stable SR1 rev. 568>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 15:21 |
|
||
|
Стиль написания клиентского ООП кода на JScript
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dronopotamus, Вы писали: D>а конструкция с баксом это опечатка, или она потом транслируется в нужный код? нет — это формат вызова методов базовых классов. classname$methodname() D>А так все очень любопытно! :) жаль для моих целей точно избыточно не сказал бы что избыточно, для простых классов — кода на 2 строки больше чем с использованием прототипов. зато очень расширябельное решение, главное начать его использовать, потом трудно отказаться.... << RSDN@Home 1.1.4 beta 6a rev. 436>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 15:38 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=33869320&tid=1391252]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 429ms |

| 0 / 0 |
