JavaScript Programming, Objects and Properties
Java/Web Programming, Lecture Notes # 2140, Revised 05/25/98.
Preface
The
material was prepared as part of a new tutorial that I plan to publish on Web
programming in general. It is not part of the Java academic curriculum at
ACC.
The purpose of this series of lessons is to teach you how to program in
JavaScript. The goal is to provide a programming tutorial that will be
accessible to persons with no programming experience and will be equally useful
to persons who already have programming experience using JavaScript or some
other language.
Introduction
According to Netscape:
JavaScript is based on a simple object-oriented paradigm. An object is
a construct with properties that are JavaScript variables or other
objects. An object also has functions associated with it that are known as
the object's methods. In addition to objects that are predefined in
the Navigator client and the server, you can define your own
objects. |
This lesson provides
information on how to create and use properties.
Properties in
JavaScript
An object has state and
behavior. In JavaScript, the state of an object is stored in its
properties. Object properties in JavaScript are variables or other objects
that are associated with the object.
Direct Access
to Properties
JavaScript allows you to directly access the
values of the properties of an object using the following syntax:
According to the
pure Netscape definition of a property, all properties are exposed and
accessible according to the syntax shown above.
However, taking some liberties and applying concepts that are common in other
areas of OOP, I will say that in some cases, the value of a property cannot be
accessed directly by referring to the name of the property as above. This
is often the case when the value of the property is not stored directly but
needs to be calculated from raw data at the time that you need it. In this
case, you refer to a method of the object that performs the desired calculation
and delivers the requested value. Again, this is not a true
property according to the Netscape definition, but rather mimics what
experts in other areas of OOP consider to be a property.
We will see examples of both types of property access in the next sample
script. An example of referring to a property access method is shown
below.
JavaScript is a
case-sensitive language, and this applies to the names of objects, properties,
and methods. For example, an object named theObj is not the same
object as one named TheObj.
Unlike other OOP languages, you can add new properties to existing objects in
JavaScript. This is illustrated in the following sample script that first
instantiates an object of the predefined object type Date and then adds a
new property to that object. The property that is added is a true property
according to the Netscape definition of a property.
The script instantiates a new object named dateObject by applying the
new operator to one form of the Date constructor. The form
of the constructor that was used creates a new object containing the date and
time that the object was constructed. This is illustrated by the following
code fragment (other forms of the constructor are available as
well).
Although this object has only one true property named prototype
(which we aren't interested in at this time), it can deliver a number of
calculated properties having to do with date and time when its methods are
invoked. In addition, we will add a new property having to do with my name
using the syntax shown in the following fragment. You can always use this
syntax to add new properties to an existing object. This syntax adds the
new property only to this one object. It is also possible to add a new
property to all objects of a given type. We will learn how to do this in a
subsequent lesson.
We will access several of these properties later for display
purposes.
dateObject.myName = "Dick Baldwin"; |
This predefined object can deliver calculated properties for month, year,
hour, minute, etc., but it doesn't actually store all of those items as separate
entities. Rather, it stores the number of milliseconds since January 1,
1970. Then, when you ask for the month, it uses a method to calculate the
month and deliver it to you. Therefore, to access these calculated
properties, you need to access the methods shown in the following code fragment.
In this fragment, we access five different methods on the object, such as
getMonth(), which return the requested information. We then assign
that information to a variable that will be displayed later.
Note that all of the information is returned from the methods in numeric
form. For example, January is represented by the numeric value 0, February
is represented by 1, etc. To make the results more consistent with what we
are accustomed to, we add one to the value returned for the month so that
January will be represented by 1 instead of 0 (as in 1/16/98 instead of 0/16/98
for January 16, 1998).
theMonth = dateObject.getMonth() + 1;
theDay = dateObject.getDate();
theYear = dateObject.getYear();
theHour = dateObject.getHours();
theMin = dateObject.getMinutes(); |
Finally, we access our new true property named myName as shown in the
following fragment. In this case, access to the property is embedded in
the argument list of a call to the write() method so that the property
value is written into the HTML document for display on the screen. Note that
this statement uses the access method for true properties provided early in this
lesson.
document.write("My name is " + dateObject.myName + "<BR>"); |
In discussing these code fragments, we have included only those fragments
most important to the subject at hand. We have skipped over the other code
necessary tie everything together. The entire script showing everything in
context appears below. The output from running the script is shown in the
comments at the beginning.
<!-- File Js00000360.htm
Copyright 1998, R.G.Baldwin
This script is designed to illustrate the fact that you can add
new properties to existing objects.
The output from running this script is:
Instantiate date object
Add new name property to the object
Display properties of date object
Date is 5/25/98
Time is 10:38
My name is Dick Baldwin
Done.
-------------------------------------------------------------------->
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript1.2">
<!-- Hide script
document.write("<BR>Instantiate date object<BR>");
dateObject = new Date();
document.write("Add new name property to the object<BR>");
dateObject.myName = "Dick Baldwin";
document.write("Display properties of date object<BR>");
theMonth = dateObject.getMonth() + 1;
theDay = dateObject.getDate();
theYear = dateObject.getYear();
theHour = dateObject.getHours();
theMin = dateObject.getMinutes();
document.write("Date is " + theMonth + "/" + theDay + "/"
+ theYear + "<BR>");
document.write("Time is " + theHour + ":" + theMin + "<BR>");
document.write("My name is " + dateObject.myName + "<BR>");
// End hiding -->
</SCRIPT>
<P> Done.
</BODY>
</HTML> |
I hope that my
discussion of true Netscape properties and calculated properties hasn't been too
confusing to you. However, I feel that in learning to write JavaScript
code, you should also be exposed to the larger world outside of JavaScript so
that when you decide to step out into that world, you won't be confined to
thinking in the narrow terms of JavaScript.
Other object-oriented programming environments strongly discourage direct
access to property values using the JavaScript syntax shown
below.
Those
programming environments strongly encourage that access to properties be
restricted to the use of property access methods using syntax such as the
following.
objectName.accessMethodName() |
In fact,
the standard design pattern for a property in Java is that it is accessible
using a method where the name of the method is as shown
below.
objectName.getPropertyName() |
In
the Java naming convention, PropertyName is the name of the property. Of
course, if you have no plans to go beyond JavaScript, you need not be concerned
with any of this.
Special for loop in
Objects
During our earlier study of flow of control, we
skipped over a special version of a for loop that is peculiar to objects
because you didn't have the background to understand it at that time. You
now have the background, so we will introduce and use it here.
According to Netscape
The for...in statement iterates a specified variable over all
the properties of an object. For each distinct property, JavaScript
executes the specified statements. A for...in statement looks as
follows:
for (variable in object) {
statements } |
We will use this
statement in the next sample script. As a preview, the following fragment
would display the names of all of the properties of an object named
myObject..
for(var prop in myObject){
document.write("prop = " + prop + "<BR>");
}//end for loop |
.
Static
Properties
JavaScript supports a concept that Netscape
refers to as static properties. The most important characteristic
of a static property is the following.
If an object type has a static property, that property can be accessed
without a requirement to instantiate an object of the type. It can
be accessed simply by joining the name of the object type to the name of
the property with a period as illustrated
below. |
In the following example,
Math is the name of an object type and PI is the name of a static
property of that object type. This expression would return the value of PI,
presumably to be used in some larger overall expression.
The same concept
is supported by other OOP languages such as Java where, in this example, PI
would be referred to as a class variable of the class named Math.
Array Access to
Properties
When we studied arrays, we learned that objects
of the Array type can behave as an associative array. In
particular, we learned that if we store a string in an element of the array, we
can then associate another variable or object with that string in the sense of a
key-value pair.
Having done this, we can access the associated value using a reference of the
following type:
In
other words, a reference to the name of the array with the name of the key in
square brackets will return the value associated with that key. (We demonstrated
that this works not only for string keys, but for boolean and non-integer
numeric keys as well.)
Properties in JavaScript appear to be stored in an associative array where
the name of the object (or the name of the object type for the case of static
properties) is the name of the array and the name of the property is the
key. The value of the property can then be accessed by referencing the
object as though it were an associative array and providing the name of the
property, in string format in square brackets, as the key.
The following statement will return the value of the static property named PI
of the object type named Math. This is an alternative to joining the name
of the object and the name of the property with a period as shown earlier.
If this were not
a static property, it would be necessary to use the name of an object
instantiated from the object type instead of the name of the object type alone.
Note that while the object behaves as an array in some respects, it doesn't
behave as an array in all respects. For example, the following expression
will not return a string representing the name of a property as would be the
case if this were an ordinary Array object.
An attempt to perform
array access on an object using a numeric index simply returns undefined.
The following sample script illustrates much of what we have been discussing
above. This script illustrates how to "discover" and display the
names and values of JavaScript object properties.
The script begins by instantiating a new array named myArray that will
be used to save the names of all the properties of the Math object type.
Then we use the special form of the for loop to obtain and save a
list of the names of all the properties of the object. This is the form of
the for loop that we introduced above. During each iteration, the
variable named prop contains a string which is the name of the next
property in the object. The loop terminates after all properties have been
examined.
Recall that an object of type Array automatically expands, as needed,
to accommodate each new element that we store in the array. In this case,
we use the length property of the Array object to determine the
index of the next new element in the array, and store the string naming the next
property in a new element having that index.
for(var prop in Math){
nameArray[nameArray.length] = prop;
}//end for loop |
At this point, we have an array containing one element for each property of
the Math object type. We use the information in this array to
execute an ordinary for loop which
- Extracts the name of the next property from our array of property names,
and
- Uses the name of the property to extract the value associated with that
property
Note in particular the following expression which is a
double-indexed operation. I have added some extra spaces to make this more
apparent.
First we extract a string from nameArray at index cnt.
This string is the name of a property. Then we use that string as an
associative index into Math to access the value of the property.
for(cnt = 0; cnt < nameArray.length; cnt++){
document.write("Property name: " + nameArray[cnt] + "<BR>"
+ "Property value: " + Math[nameArray[cnt]] +"<BR>");
}//end for loop |
This sample script also illustrates the ability to access the values of
non-static properties by performing an associative access on the name of an
object of type Math. In this case, since the Math type
doesn't have any non-static properties, I instantiated an object of type
Math named myObj and added a property to the object named
myName. I assigned a string value to the property which was, in
fact, my name.
I then used the name of the new property to access its value in two different
ways:
- By using the associative technique with square brackets.
- By joining the name of the property to the name of the object with a
period.
In both cases, the value that was returned (my name) was passed as a
parameter to the write() method where it was displayed on the screen.
myObj = new Math();
myObj.myName = "Dick Baldwin";
document.write("Array style: "+ myObj["myName"] + "<BR>");
document.write("Normal style: " + myObj.myName); |
All of the code fragments discussed above can be viewed in context in the
complete listing of the script which follows. The comments at the
beginning of the script show the output produced by the various calls to the
write() method in the script.
<!-- File Js00000370.htm
Copyright 1998, R.G.Baldwin
This script is designed to illustrate how to "discover" and display
the names and values of JavaScript object properties.
The output from running this script is:
Get and save property names in an array
Use property names to access values
Property name: E
Property value: 2.718281828459045
Property name: LOG2E
Property value: 1.4426950408889634
Property name: LOG10E
Property value: .4342944819032518
Property name: LN2
Property value: .6931471805599453
Property name: LN10
Property value: 2.302585092994046
Property name: PI
Property value: 3.141592653589793
Property name: SQRT2
Property value: 1.4142135623730951
Property name: SQRT1_2
Property value: .7071067811865476
Instantiate an object of type Math, add a new
property to the object, and display the value of
the new property by referencing it both in
associative array style and "normal" style.
Array style: Dick Baldwin
Normal style: Dick Baldwin
Done.
-------------------------------------------------------------------->
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript1.2">
<!-- Hide script
document.write("Get and save property names in an array<BR>");
nameArray = new Array();
for(var prop in Math){
nameArray[nameArray.length] = prop;
}//end for loop
document.write("Use property names to access values<BR>");
for(cnt = 0; cnt < nameArray.length; cnt++){
document.write("Property name: " + nameArray[cnt] + "<BR>"
+ "Property value: " + Math[nameArray[cnt]] +"<BR>");
}//end for loop
document.write(
"<BR>Instantiate an object of type Math, add a new<BR>"
+ "property to the object, and display the value of<BR>"
+ "the new property by referencing it both in<BR>"
+ "associative array style and \"normal\" style.<BR><BR>");
myObj = new Math();
myObj.myName = "Dick Baldwin";
document.write("Array style: "+ myObj["myName"] + "<BR>");
document.write("Normal style: " + myObj.myName);
// End hiding -->
</SCRIPT>
<P> Done.
</BODY>
</HTML> |
-end-