Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 20.07.06 13:37
Оценка:
Приветствую.
Приходится писать в 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>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Стиль написания клиентского ООП кода на JScript
От: Аноним  
Дата: 21.07.06 06:15
Оценка:
http://dklab.ru/chicken/nablas/40.html

а потом еще пару следующих "набл"
Re: Стиль написания клиентского ООП кода на JScript
От: _JoKe_  
Дата: 21.07.06 07:06
Оценка:
Здравствуйте, 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 >>
Re[2]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 21.07.06 07:31
Оценка:
Здравствуйте, _JoKe_, Вы писали:

"сударь, да вы знаете толк в извращениях!" (с)
на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class
щас попытаюсь сам придумать )
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[2]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 21.07.06 07:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


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


спасибо за ссылку! узнал много нового
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 21.07.06 07:58
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

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


D>"сударь, да вы знаете толк в извращениях!" (с)

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

даже придумывать не надо, в статье http://dklab.ru/chicken/nablas/40.html все пишут
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Стиль написания клиентского ООП кода на JScript
От: kaer  
Дата: 21.07.06 07:59
Оценка: 3 (1)
Здравствуйте, Dronopotamus, Вы писали:

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


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


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


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


пожалуйста я сам когда-то набрел туда с другой наблы — про JSHttpRequest, и был приятно удивлен столь подробной инфой про js
Re[3]: Стиль написания клиентского ООП кода на JScript
От: _JoKe_  
Дата: 21.07.06 08:59
Оценка: 2 (1)
Здравствуйте, 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 >>
Re[4]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 21.07.06 10:05
Оценка:
Здравствуйте, _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>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[5]: Стиль написания клиентского ООП кода на JScript
От: _JoKe_  
Дата: 24.07.06 06:46
Оценка:
Здравствуйте, 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 >>
Re: Стиль написания клиентского ООП кода на JScript
От: tripolox Россия  
Дата: 24.07.06 07:50
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>Приветствую.

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

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

По фичам JScript советую почитать здесь, для осознания МОЩИ JavaScript'а мне очень помогла статья про closures.
Стиль написания клиентского ООП кода на JScript
От: Аноним  
Дата: 20.07.06 14:30
Оценка:
наиболее оптимальным вторую часть скрипта:
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


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Стиль написания клиентского ООП кода на JScript
От: Аноним  
Дата: 20.07.06 16:00
Оценка:
обязательно советую прочитать
http://
Сразу поймёшь,что это такое

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

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

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

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

На джава скрипте можно сделать очень многое, на то чтобы осилить вышеприведённый материал потребуется от нескольких дней до недели, но результат будет того стоить


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 25.07.06 08:30
Оценка:
Здравствуйте, ZeusTheTrueGod, Вы писали:

спасибо за ссылки!
буду изучать

пока самые полезные ссылочки по теме у меня вот эти:
статья "Наследование в 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
Автор: _JoKe_
Дата: 30.01.06

похоже ваша ссылка тоже сюда
ну и спецификация ecma-262

может пригодится таким же как я в будущем
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Стиль написания клиентского ООП кода на JScript
От: mogadanez Чехия  
Дата: 27.07.06 08:28
Оценка: 3 (1)
Здравствуйте, 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>>
Re[2]: Стиль написания клиентского ООП кода на JScript
От: Dronopotamus Россия  
Дата: 27.07.06 11:21
Оценка:
Здравствуйте, mogadanez, Вы писали:

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

M> {
M> base_class$override_sample( param ) // вызов бвзового метода
M> }

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

А так все очень любопытно! жаль для моих целей точно избыточно
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Стиль написания клиентского ООП кода на JScript
От: mogadanez Чехия  
Дата: 27.07.06 11:38
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

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


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

classname$methodname()



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


не сказал бы что избыточно, для простых классов — кода на 2 строки больше чем с использованием прототипов.
зато очень расширябельное решение, главное начать его использовать, потом трудно отказаться.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.