powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Стиль написания клиентского ООП кода на JScript
19 сообщений из 19, страница 1 из 1
Стиль написания клиентского ООП кода на JScript
    #33868006
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.
Приходится писать в 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>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33868177
Dmitry Uvarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наиболее оптимальным вторую часть скрипта:
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
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33868325
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обязательно советую прочитать
http://]http://www.crockford.com/#javascript
Сразу поймёшь,что это такое

Слева там будет список всех его статей , советую прочитать, причём все))

Краткое содержание:
ООП в javascript, private,public,privileged, classic inheritance,parasitice inheritance,multiple inheritance

Кроме того, советую разобраться с NameSpace, в js они тоже есть, но только для тех,кто внимательно прочитал.

Ну а если хочешь узнать все скрытые возможности, то ключевое слово: BeyondJS.

На джава скрипте можно сделать очень многое, на то чтобы осилить вышеприведённый материал потребуется от нескольких дней до недели, но результат будет того стоить :)
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33868699
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

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

А есть что почитать, про это на русском языке и чтобы было с самых азов.

Спасибо.
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33868987
Аноним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://dklab.ru/chicken/nablas/40.html

а потом еще пару следующих "набл" :)
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869191
_JoKe_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, 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 >>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869194
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Самое то.
Как раз чтобы начать...
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869320
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, <Аноним>, Вы писали:

А>http://dklab.ru/chicken/nablas/40.html

А>а потом еще пару следующих "набл" :)

спасибо за ссылку! узнал много нового :up:... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869321
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _JoKe_, Вы писали:

"сударь, да вы знаете толк в извращениях!" (с) :))
на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class :)
щас попытаюсь сам придумать )... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869471
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Dronopotamus, Вы писали:

D>Здравствуйте, _JoKe_, Вы писали:

D>"сударь, да вы знаете толк в извращениях!" (с) :))
D>на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class :)
D>щас попытаюсь сам придумать )

даже придумывать не надо, в статье http://dklab.ru/chicken/nablas/40.html все пишут :wow:... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869480
kaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Dronopotamus, Вы писали:

D>Здравствуйте, <Аноним>, Вы писали:

А>>http://dklab.ru/chicken/nablas/40.html

А>>а потом еще пару следующих "набл" :)

D>спасибо за ссылку! узнал много нового :up:

пожалуйста :) я сам когда-то набрел туда с другой наблы — про JSHttpRequest, и был приятно удивлен столь подробной инфой про js :)
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33869783
_JoKe_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, 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 >>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33870087
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _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>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33873037
_JoKe_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, 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 >>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33873257
tripolox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Dronopotamus, Вы писали:

D>Приветствую.
D>Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js :)
D>Я сейчас использую вот такой синтаксис:

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

По фичам JScript советую почитать здесь, для осознания МОЩИ JavaScript'а мне очень помогла статья про closures.
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33876307
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, 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>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33881855
mogadanez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, 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>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33882521
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, mogadanez, Вы писали:

M> this.methods.override_sample (param) // перегрузка не требует никаки дополнительных операторов
M> {
M> base_class$override_sample( param ) // вызов бвзового метода
M> }

а конструкция с баксом это опечатка, или она потом транслируется в нужный код?

А так все очень любопытно! :) жаль для моих целей точно избыточно... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
Стиль написания клиентского ООП кода на JScript
    #33882581
mogadanez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Dronopotamus, Вы писали:

D>а конструкция с баксом это опечатка, или она потом транслируется в нужный код?

нет — это формат вызова методов базовых классов.


classname$methodname()


D>А так все очень любопытно! :) жаль для моих целей точно избыточно

не сказал бы что избыточно, для простых классов — кода на 2 строки больше чем с использованием прототипов.
зато очень расширябельное решение, главное начать его использовать, потом трудно отказаться.... << RSDN@Home 1.1.4 beta 6a rev. 436>>
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Стиль написания клиентского ООП кода на JScript
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]