Hi, > is there a way that I can get rid of all these usages of "this"
No. `this` is different in Javascript than in some other languages with the same keyword, in several ways. One of these is that unqualified references like your _div (without anything in front of it) are not automatically resolved against property names on `this`; all identifier resolution in Javascript is lexically-based, using the concept of a "scope chain" (more below if you're interested). So you have to explicitly type `this.` when accessing the properties on `this` (just as you have to type `foo.` to access the properties on `foo`), or as you've found, you can use `with`. Be aware that using `with` has some "gotchas" that are not obvious. Douglas Crockford lists many of these in his "with Statement Considered Harmful"[1] article (I'm not a fan of "Considered Harmful" articles[2], but Crockford lays out the issues fairly well). My point isn't "don't use it", it's "be sure you understand the gotchas when using it". About the scope chain and identifier resolution: One of the things I love about Javascript is that basically *everything* is an object, even if some of the objects are hidden behind the scenes. One of these behind-the-scenes objects is the "variable object" (the "binding object of the variable environment" in the latest spec -- yikes). When you declare a variable using `var`, you're adding a *property* to the variable object for the current scope. The variable object has properties for all `var`s, all functions declared in the scope, and (if the scope relates to a function) all named arguments to the function. When the step-by-step code within the scope is executing, that scope's variable object is at the beginning of the "scope chain." All unqualified references are first checked against that variable object to see if they match a property on it. If they do, that property is used; if not, the next variable object in the chain is checked; etc. Example: var x = 1; function foo() { var y = 2; function bar() { var z = 3; alert(x); alert(y); alert(z); } } We have three "scopes" there: Global scope, `foo`'s scope, and `bar`'s scope. Consequently, we have three variable objects. When code within `bar` is being executed, the scope chain consists of `bar`'s variable object, followed by `foo`'s, followed by the global variable object. When `bar` references `z`, the `z` property is found on the first variable object and used. When `bar` references `y`, it's not on the first variable object but it is on the second one, so it's used from there. Accessing `x` involves going back two variable objects to the global one. As you can see, `this` doesn't come into it -- it's nowhere on the scope chain unless you insert it, which is exactly what `with` does: Puts the object you specify at the beginning of the scope chain. Now, I called the variable object a behind-the-scenes object. That's usually true, but there's an exception: The variable object for the global scope is the global object, which on browsers is `window` (more accurately, on browsers the global object has a property, `window`, it points to itself with). That's why when you declare variables and functions at global scope, they magically show up as properties on `window`. [1] http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/ [2] http://meyerweb.com/eric/comment/chech.html HTH, -- T.J. Crowder Independent Software Consultant tj / crowder software / com www.crowdersoftware.com On Apr 29, 9:17 am, Ran Berenfeld <berenfeld...@gmail.com> wrote: > Hi all > I have written a class using prototype Class object > and after playing it for a while, I saw that I need to use the "with" > keyword in the class members, > so I can access its members > > here is the relevant part of the class : (the member is "_div") > > var JSClass = Class.create ({ > initialize: function(initParams) { > > if (initParams.div) > { > *this*._div = $(initParams.div); > } > else > { > *this*._div = new Element(div); > } > }, > // an example of a member function > setComment: function(msg) > { > *with(this)* > * {* > * *_div.innerHTML = msg; > * }* > } > > }); > > is there a way that I can get rid of all these usages of "this" > > Thanks > Ran > > -- > You received this message because you are subscribed to the Google Groups > "Prototype & script.aculo.us" group. > To post to this group, send email to prototype-scriptacul...@googlegroups.com. > To unsubscribe from this group, send email to > prototype-scriptaculous+unsubscr...@googlegroups.com. > For more options, visit this group > athttp://groups.google.com/group/prototype-scriptaculous?hl=en. -- You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to prototype-scriptacul...@googlegroups.com. To unsubscribe from this group, send email to prototype-scriptaculous+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en.