Hi, (Your English seems very good indeed, FWIW.)
On #2: Accessing members or globals aren't the only things people might do with initializers. Hence the comment about closures. On #6: Well, it's your call, as I say the spec does allow repeated var declarations, although (again) if you use any lint tools, there's a warning you're going to have to disable. :-) But probably best not to have style discussions here (or indeed at all, really, I shouldn't have brought it up). -- T.J. Crowder tj / crowder software / com On May 14, 4:46 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote: > Thank you for reading it so carefully. > I'm not good at English but I will try my best to describe it clearly. > > 1. It's a bit like a dog riding a bicycle. > I completely agree with you. > But don't you think it is a bit like "Class.create" in prototype? > I will never use it in my program myself. > It is just "a interesting code" for me. > I prefer to use functional programming(Later I may show you a > interesting implement of currying) or the following: > function class1() > { > class2.call(this)//inherit > class3.call(this)//multi-inherit > this.v1=1;//public > var v2=2;//private} > > class1.prototype.v3//do not use > > 2.It is used to create js class like class in java or c# > So member functions can only visit global variables no matter where > Initalizer is defined. > > 3.Eval cost much and is not friendly to debugger but it is the only > way to point [[scope]] to a normal object in scope chain. > > 4.I think we can ignore the cost in main script. > But in fact it is even worse, the code for classes defined in this way > is evaluated more than twice. > It is evaluated every time when creating a object from the class. > > 5. Sorry,I forget to delete "ret.prototype=Initalizer.prototype;" > > 6.I don't think it is a bad style.In fact I like it very much...... > :-) > > On 5月14日, 下午6时54分, "T.J. Crowder" <[EMAIL PROTECTED]> wrote: > > > > > > > Hi, > > > It's certainly an interesting approach. :-) Some observations: > > > 1. It works; kudos. It's a bit like a dog riding a bicycle, but > > still... > > > 2. You'd have to document like *crazy* the fact that the code passed > > to the Class function *isn't* evaluated in the apparent lexical scope, > > but rather in the really very special lexical scope created within the > > Class function. (Well, actually, it's evaluated in both, but the > > second is the one that will get used.) Users failing to appreciate > > the subtleties related to that would tend to run into difficult-to- > > track-down bugs, particularly related to closures. And *they'd* have > > to document it like crazy in their own code, as well, so anyone > > picking it up is forewarned. Maintenance nightmares loom. > > > 3. Debugging would tend to be fairly difficult, what with the class > > and all of its member functions being within the eval, not (again) > > actually where they appear to be. I expect over time that JavaScript > > debuggers will handle debugging eval'd code more and more elegantly > > (certainly there is effort being made there), but for the moment... > > > 4. The code for classes defined in this way is evaluated twice, once > > in the course of the main script being evaluated, and then again when > > Class is called. Given that page load times are king, this isn't > > ideal although I'm sure it happens fairly quickly. > > > 5. Regarding this: > > > > ret.prototype=Initalizer.prototype; > > > > for(var p in > > > Initalizer.prototype)ret.prototype[p]=Initalizer.prototype[p]; > > > Given the assignment in the first line, what is the purpose of the > > loop following it? Genuine question, not a dig -- am I missing a > > subtlety? Seems likely I am. > > > 6. Style point: You declare 'p' at least three times, which various > > lint tools may complain about although it's allowed by the ECMA spec. > > (It Really Shouldn't Be, but it is.) > > > Thanks for the post -- it's interesting. Very much about tradeoffs, > > cost/benefit. For me, most of the time, I think the cost would tend > > to be too high, but it's still an interesting approach to the old > > problem. > > -- > > T.J. Crowder > > tj / crowder software / com > > > On May 13, 7:22 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote: > > > > /*author:[EMAIL PROTECTED]/ > > > function Class(Initalizer,SuperClasses) > > > { > > > if(!SuperClasses)SuperClasses=[]; > > > var ret=function(){ > > > for(var i=0;i<SuperClasses.length;i++) > > > { > > > SuperClasses[i].call(this); > > > } > > > > var $private={}; > > > var $public=this; > > > var $static=ret; > > > > with($static){ > > > with($private){ > > > with($public){ > > > > > > eval("("+Initalizer+").apply(this,arguments)"); > > > } > > > } > > > } > > > return this; > > > } > > > > ret.prototype=Initalizer.prototype; > > > > for(var p in > > > Initalizer.prototype)ret.prototype[p]=Initalizer.prototype[p]; > > > for(var p in Initalizer)ret[p]=Initalizer[p]; > > > for(var i=0;i<SuperClasses.length;i++) > > > { > > > for(var p in SuperClasses[i].prototype) > > > { > > > ret.prototype[p]=SuperClasses[i].prototype[p] > > > } > > > } > > > return ret; > > > > } > > > > /* > > > function alert(s) > > > { > > > WScript.echo(s);} > > > > */ > > > > /*********************************************** > > > Example:public static private > > > ************************************************/ > > > > var test1=new Class(function(){ > > > > //v1 is public > > > $public.v1=1; > > > > //v2 is private > > > $private.v2=2; > > > > //define public variable with this > > > this.vv1=2; > > > > //public function member > > > $public.show=function(){ > > > //visit public and private variable > > > alert(v1); > > > alert(v2); > > > } > > > $public.set_static=function(v){ > > > $static.v3=v; > > > } > > > > }); > > > > var obj=new test1(); > > > > //visit public variable > > > alert(obj.v1); > > > alert(obj.vv1); > > > > //try to visit private variable > > > alert(obj.v2); > > > > //call public member function > > > obj.show(); > > > > //set static variable > > > obj.set_static(10); > > > //visit static variable from class > > > alert(test1.v3); > > > > /*********************************************** > > > Example:multi-inherit > > > ************************************************/ > > > var parent=function(){this.v4=6}; > > > parent.prototype.v5=1000; > > > > var test2=new Class(function(){ > > > $public.show2=function(){ > > > alert(this.v1); > > > alert(v4); > > > alert(v5); > > > } > > > > },[test1,parent]); > > > > var obj=new test2(); > > > obj.show2();- 隐藏被引用文字 - > > > - 显示引用的文字 - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Spinoffs" group. To post to this group, send email to rubyonrails-spinoffs@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs?hl=en -~----------~----~----~----~------~----~------~--~---