| By Victor Rasputnis, Anatole Tartakovsky, Igor Nys | Article Rating: |
|
| October 9, 2006 12:00 PM EDT | Reads: |
28,088 |
Since JavaScript does not provide a way to syntactically denote a class definition, we'll use the with statement to mark the class definition boundaries. This will also make the example code smaller as the with statement is allowed to perform a series of statements on a specified object without qualifying the attributes.
function Calculator() {};
with (Calculator) {
prototype._prop = 0;
prototype.setProp = function(p) {_prop = p};
prototype.getProp = function() {return _prop};
}
So far we have defined and initialized the public _prop variable as well as provided getter and setter methods for it.
Need to define a static variable? Just think of the static variable as being a variable owned by the class. Because classes in JavaScript are represented by function objects, we just need to add a new property to the function:
Calculator.iCount = 0;
Now that the iCount variable is a property of the Calculator object, it will be shared between all instances of the class calculator.
function Calculator() {
Calculator.iCount++;
};
The above code will count all created instances of the class Calculator.
Encapsulation
Using "Calculator", as defined
above, permits access to all the "class" data, increasing the risk of
name collisions in inherited classes. We clearly need encapsulation to
view objects as self-contained entities.
A standard language mechanism of data encapsulation is private variables. And a common JavaScript technique for emulating a private variable is to define a local variable in the constructor, so that this local variable is accessible exclusively via getter and setter - inner functions of the very same constructor. In the following example, the _prop variable is defined within the Calculator function and is not visible outside of the function scope. Two anonymous inner functions, assigned to setProp and getProp attributes, provide access to our "private" variable. Also, please note the use of this, quite similar to how it is used in Java:
function Calculator() {
var _prop = 0;
this.setProp = function (p){_prop = p};
this.getProp = function() {return _prop};
};
What is often overlooked is the cost of such encapsulation in JavaScript. It can be tremendous, because inner function objects get repeatedly created for each instance of the "class".
Accordingly, since constructing objects based on the prototype is faster and consumes less memory, we cast our vote in favor of public variables wherever performance is critical. You can use naming conventions to avoid name collisions, for example, by prefixing public variables with the class name.
Inheritance
At first glance, JavaScript lacks
support for the class hierarchy similar to what programmers of
conventional object-oriented languages expect from the modern language.
However, although JavaScript syntax does not support class inheritance
as in Java, inheritance can still be implemented by copying an instance
of a previously defined class into the prototype of the derived one.
Before we provide an illustration, we need to introduce a constructor property. JavaScript makes sure that every prototype contains constructor, which holds a reference to the constructor function. In other words, Calculator.prototype.constructor contains a reference to Calculator().
Now, the code below shows how to derive the class ArithmeticCalculator from the base class Calculator. "Line 1" results in borrowing all properties of the Calculator, while "Line 2" restores the value of the prototype, constructor back to ArithmeticCalculator:
function ArithmeticCalculator() { };
with (ArithmeticCalculator) {
ArithmeticCalculator .prototype = new Calculator(); //Line 1
prototype.constructor = ArithmeticCalculator; //Line 2
}
Even if the example above looks like a composition rather than inheritance, the JavaScript engine knows about the prototype chain. In particular, the instanceof operator will work correctly with both the base and derived classes. Assuming you create a new instance of a class ArithmeticCalculator:
var c = new ArithmeticCalculator;
expressions c instanceof Calculator and c instanceof ArithmeticCalculator will both evaluate to true.
Notice, that the constructor of the base class in the example above is called at the point when the ArithmeticCalculator prototype is initialized and not when an instance of the derived class is created. This could have unwanted side effects and you should consider creating a separate function for initialization purposes. As the constructor is not a member function, it can't be called through this reference directly. We will need to create a "Calculator" member function to be able to call super:
function Calculator(ops) { ...};
with (Calculator) {
prototype.Calculator = Calculator;
}
Now we can write an inherited class that explicitly calls the constructor in the base class:
function ArithmeticCalculator(ops) {
this.Calculator(ops);
};
with (ArithmeticCalculator) {
ArithmeticCalculator .prototype = new Calculator;
prototype.constructor = ArithmeticCalculator;
prototype.ArithmeticCalculator = ArithmeticCalculator;
}
Polymorphism
JavaScript is a non-typed language
where everything is an object. Accordingly, if there are two classes A
and B, both defining method foo(), JavaScript will allow polymorphic
invocation of foo() across instances of A and B even if there is no
hierarchical relation (albeit implementational) whatsoever. From that
perspective, JavaScript provides a wider polymorphism then Java. The
flexibility, as usual, comes at a price. In this case, it is a price of
delegating the type checking job to application code. Specifically, if
there is a need to check that a reference indeed points to a desired
base class, it can be done with the instanceof operator.
On the other hand, JavaScript doesn't check parameters in the function calls, which prevents from defining polymorphic functions with the same name and different parameters (and let the compiler choose the right signature). Instead, JavaScript provides an argument object - Java 5 style - within a function scope that allows you to implement a different behavior depending on the parameter's type and quantity.
Example
Listing 5
implements a calculator that calculates expressions in a reverse Polish
notation. It illustrates the main techniques described in the articles
and also shows the usage of the unique JavaScript features, such as
accessing object properties as an array element for a dynamic function
call.
To make Listing 5 work we also need to provide a piece of code that instantiates the calculator objects and calls the evaluate method:
var e = new ArithmeticCalcuator([2,2,5,"add","mul"]);
alert(e.evaluate());
AJAX Component Authoring
All AJAX component
authoring solutions known today can be logically divided into two
groups. The first group specifically targets the seamless integration
with the HTML-based UI definition. The second group drops HTML as a UI
definition language in favor of certain XML. In this article we
illustrate one approach from the first group, an analog to JSP tags,
albeit in the browser. These browser-specific component authoring
extensions are called element behaviors in the IE case or extensible
bindings in the case of the latest versions of Firefox, Mozilla, and
Netscape 8.
Custom Tag Dialects
Internet Explorer, starting
with version 5.5, enables the JavaScript authoring of custom,
client-side HTML elements. Unlike JSP tags, these objects are not
preprocessed into HTML on the server side. Rather, they're legitimate
extensions of a standard HTML object model and everything, including
control construction, happens dynamically on the client. Similarly,
Gecko-engine based browsers can dynamically decorate any existing HTML
element with a reusable functionality.
It's possible, therefore, to build a library of rich UI components with methods, events, and attributes that will have HTML syntax. Such components can be freely mixed with standard HTML. Internally, these components will communicate with application servers, AJAX style. In other words, it's possible (and relatively simple) to build your own AJAX object model.
The IE flavor of this approach is called HTC or HTML components; the Gecko version is called XBL - eXtensible Bindings Language. For the purposes of this article, we'll focus on IE.
Enter the HTML Components - HTC
HTC or HTML
components are also called behaviors. In turn they are divided into
attached behaviors that decorate any existing HTML element with a set
of properties, events, and methods, and element behaviors that look
like an extended set of custom HTML tags to the hosting page. Together,
element and attached behaviors provide a simple solution for authoring
both components and applications. Here we'll illustrate the most
comprehensive case, element behaviors.
Published October 9, 2006 Reads 28,088
Copyright © 2006 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Victor Rasputnis
Dr. Victor Rasputnis is a Managing Principal of Farata Systems. He's responsible for providing architectural design, implementation management and mentoring to companies migrating to XML Internet technologies. He holds a PhD in computer science from the Moscow Institute of Robotics. You can reach him at vrasputnis@faratasystems.com
More Stories By Anatole Tartakovsky
Anatole Tartakovsky is a Managing Principal of Farata Systems. He's responsible for creation of frameworks and reusable components. Anatole authored number of books and articles on AJAX, XML, Internet and client-server technologies. He holds an MS in mathematics. You can reach him at atartakovsky@faratasystems.com
More Stories By Igor Nys
Igor Nys is a Director of Technology Solutions at EPAM Systems, Inc, a company combining IT consulting expertise with advanced onshore-offshore software development practices. Igor has been working on many different computer platforms and languages including Java, C++, PowerBuilder, Lisp, Assembler since the mid 80's. Igor is currently managing a number of large distributed projects between US and Europe. In addition Igor is the author of the award-winning freeware system-management tools, and he was closely involved in the development of XMLSP technology - one of the AJAX pioneers.
![]() |
Bill Watkins 11/09/06 12:18:37 PM EST | |||
www.ajaxmaker.com:8080/blog/zipsearch.htm. Overall nice first effort though. |
||||
![]() |
Dennis 10/17/06 08:39:39 AM EDT | |||
The text and the code are not consistent. This makes it tough to follow the concepts being presented in the article. For example: "Let's look at the function handleResponse()..." There is no function "handleResponse()" in the code. The function ask() is explained before its presented in the code examples. The anonymous function "handleHTTPRequest" is presented in the text as "function (){ handleHttpResponse(http, fieldToFill, lookupField)}" and in the code as "function handleHttpResponse(http, fieldToFill, lookupField)". |
||||
- Kindle 2 vs Nook
- Cloud Computing on Gartner's Top 10 List and SYS-CON Events' 2010 Calendar
- Confessions of a Ulitzer Addict
- IBM Hardware Chief, Intel VC Exec Arrested in Insider Trading Scam
- Tactical Cloud Computing Panel at 1st Annual GovIT Expo
- Ulitzer.com Named Exclusive "New Media" Sponsor of Cloud Computing Conference & Expo
- Moving Your RIA Apps into the Cloud: Seven Challenges
- Adobe’s Aiming ColdFusion at Multiple Clouds
- Windows 7 – Microsoft’s First Step to the Cloud
- Ulitzer Provides a Powerful Social Journalism Platform
- Jill Tummler Singer, Deputy CIO of CIA, Keynotes at GovIT Expo
- Open Source Mobile Cloud Sync and Push Email
- Kindle 2 vs Nook
- The Difference Between Web Hosting and Cloud Computing
- Cloud Computing on Gartner's Top 10 List and SYS-CON Events' 2010 Calendar
- Ajax in RichFaces 3.3, JSF 2 and RichFaces 4
- Confessions of a Ulitzer Addict
- IBM Hardware Chief, Intel VC Exec Arrested in Insider Trading Scam
- My Thoughts on Ulitzer
- Tactical Cloud Computing Panel at 1st Annual GovIT Expo
- Ulitzer.com Named Exclusive "New Media" Sponsor of Cloud Computing Conference & Expo
- US Post Office Hops a Ride on NetSuite’s Cloud
- Moving Your RIA Apps into the Cloud: Seven Challenges
- Adobe’s Aiming ColdFusion at Multiple Clouds
- Building a Drag-and-Drop Shopping Cart with AJAX
- What Is AJAX?
- Google Maps! AJAX-Style Web Development Using ASP.NET
- Flashback to January 2006: Exclusive SYS-CON.TV Interviews on "OpenAjax Alliance" Announcement
- AJAXWorld Conference & Expo to Take Place October 2-4, 2006, at the Santa Clara Convention Center, California
- AJAX Sponsor Webcasts Are Now Available at AJAXWorld Website
- How and Why AJAX, Not Java, Became the Favored Technology for Rich Internet Applications
- "Real-World AJAX" One-Day Seminar Arrives in Silicon Valley
- AJAXWorld University Announces AJAX Developer Bootcamp
- AJAX Support In JadeLiquid WebRenderer v3.1
- Where Are RIA Technologies Headed in 2008?
- Struts Validations Framework Using AJAX






































