A Javascript array that can respond to changes

B

Ben Katz

Is it possible to have a JavaScript object that works just like a
standard Array, except that when the array is modified, a function
gets called which can then do some processing on the array?

Like this:
// SpecialArray has a function called Notify
function Notify()
{
// process the array with changes made
}
var myarray = new SpecialArray("zero", "one", "two", "three");
myarray[1] = "ein"; // after this change is made, function "Notify"
is called


I know you can derive a new object from Array, but you cannot directly
override the [] operator.

Can you add a function or event handler to a regular Array object that
gets called when the array changes?

Thanks for any input.
bk
 
L

Lasse Reichstein Nielsen

Is it possible to have a JavaScript object that works just like a
standard Array, except that when the array is modified, a function
gets called which can then do some processing on the array?

Generally not.
Netscape and Mozilla supports attaching handlers to properties that
are called when the properties change.
<URL:http://devedge.netscape.com/library/manuals/2000/javascript/1.5/reference/object.html#1193628>

Neither IE nor Opera have inplemented this feature, and it is not part
of the ECMAScript standard.

/L
 
D

Douglas Crockford

Is it possible to have a JavaScript object that works just like a
standard Array, except that when the array is modified, a function
gets called which can then do some processing on the array?

Like this:
// SpecialArray has a function called Notify
function Notify()
{
// process the array with changes made
}
var myarray = new SpecialArray("zero", "one", "two", "three");
myarray[1] = "ein"; // after this change is made, function "Notify"
is called


I know you can derive a new object from Array, but you cannot directly
override the [] operator.

Can you add a function or event handler to a regular Array object that
gets called when the array changes?

No, put you can define a method that will have the effect you want, with a
different look perhaps. Make a constructor that takes two arguments: an array of
values, and an optional method to be called when changed.

function SpecialArray(array, method) {
this.get = function (index) {
return array[index];
};
this.put = function (index, value) {
array[index] = method ? method.apply(this, [index, this.get(index),
value]) : value;
};
}

The method you supply takes three parameters: The index, the old value, and the
new value. It should return the definitive new value (or the old value to leave
it effectively unchanged). This method can also do any notifications that you
need.

myarray = new SpecialArray(["zero", "one", "two", "three"], function (index,
older, newer) {
return newer;
});

Use myarray's privileged .get(index) and .put(index, value) methods to read and
write its contents.

myarray.set(1, "eine");

http://www.crockford.com/javacript/private.html
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top