Приветствую.
Приходится писать в ASP.NET приложениях много клиентского кода на JScript, видел несколько способов написания обьектного кода на js, но я в js не доктор, знакомых гуру по js нету, вот решил узнать как вообще принято обьектно-ориентировано писать на js
Я сейчас использую вот такой синтаксис:
Здравствуйте, 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
"сударь, да вы знаете толк в извращениях!" (с)
на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class
щас попытаюсь сам придумать )
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[2]: Стиль написания клиентского ООП кода на JScript
Здравствуйте, Dronopotamus, Вы писали:
D>Здравствуйте, _JoKe_, Вы писали:
D>"сударь, да вы знаете толк в извращениях!" (с) D>на самом деле прикольно, было бы любопытно взглянуть на реализацию функции Class D>щас попытаюсь сам придумать )
Здравствуйте, Dronopotamus, Вы писали:
D>Здравствуйте, <Аноним>, Вы писали:
А>>http://dklab.ru/chicken/nablas/40.html
А>>а потом еще пару следующих "набл"
D>спасибо за ссылку! узнал много нового
пожалуйста я сам когда-то набрел туда с другой наблы — про JSHttpRequest, и был приятно удивлен столь подробной инфой про js
Re[3]: Стиль написания клиентского ООП кода на JScript
Здравствуйте, 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
спасибо!
в вашем первом сообщении ошибка вроде в обращениях к базовому классу (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 defaultif (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
Здравствуйте, 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
Здравствуйте, 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
Re: Стиль написания клиентского ООП кода на JScript
От:
Аноним
Дата:
20.07.06 16:00
Оценка:
обязательно советую прочитать http://
Сразу поймёшь,что это такое
Слева там будет список всех его статей , советую прочитать, причём все))
Краткое содержание:
ООП в javascript, private,public,privileged, classic inheritance,parasitice inheritance,multiple inheritance
Кроме того, советую разобраться с NameSpace, в js они тоже есть, но только для тех,кто внимательно прочитал.
Ну а если хочешь узнать все скрытые возможности, то ключевое слово: BeyondJS.
На джава скрипте можно сделать очень многое, на то чтобы осилить вышеприведённый материал потребуется от нескольких дней до недели, но результат будет того стоить
Здравствуйте, 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 модули. В примере выше на стороне сервера мы напишем:
первые 5 скриптов подключаются автоматом.
Подобные утилиты для такой "компиляции" можно написать на разных языках и для разных сред. в частности у нас есть утилита на Python'е, которая умеет генерировать
— один большой собранный js файл.
— wsf файл примерно такого содержания:
Здравствуйте, Dronopotamus, Вы писали:
D>а конструкция с баксом это опечатка, или она потом транслируется в нужный код?
нет — это формат вызова методов базовых классов.
classname$methodname()
D>А так все очень любопытно! жаль для моих целей точно избыточно
не сказал бы что избыточно, для простых классов — кода на 2 строки больше чем с использованием прототипов.
зато очень расширябельное решение, главное начать его использовать, потом трудно отказаться.