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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---