Object.prototype, getters and setters

W

Wei Wang

Greetings,

I find the JavaScript's Object.prototype and getter/setter mechanism
very nice. However, I need some help with extending an object with
getters/setters in the derived class. For example:

A : function () {}

A.prototype =
{
a : null,

get a : function () { return a++; }
};


B : function () {}

B.prototype = new A;

Now, I would like to define a getter/setter in B. How do I do that?
There is no way to use the same syntax as in "A.prototype = ..." above.

Thanks for your help.

Regards,
 
M

Martin Honnen

Wei Wang wrote:

I find the JavaScript's Object.prototype and getter/setter mechanism
very nice. However, I need some help with extending an object with
getters/setters in the derived class. For example:

A : function () {}

A.prototype =
{
a : null,

get a : function () { return a++; }
};


B : function () {}

B.prototype = new A;

Now, I would like to define a getter/setter in B. How do I do that?
There is no way to use the same syntax as in "A.prototype = ..." above.

What you have looks like some pseudo syntax to me, here is how it works
in pratice:

function A () {
this._a = 0;
}
A.prototype.__defineGetter__('a',
function () {
return this._a++;
}
);


function B () {
A.apply(this);
this._b = 0;
}
B.prototype = new A();
B.prototype.__defineGetter__('b',
function () {
return this._b--;
}
);

var b = new B();
alert(b.a);
alert(b.a);
alert(b.b);
alert(b.b);

And note that getters/setters are an extension to the ECMAScript edition
3 standard that is only implemented in the Mozilla JavaScript engine.
 
T

Thomas 'PointedEars' Lahn

Martin said:
Wei said:
[...]
A : function () {}

A.prototype =
{
a : null,

get a : function () { return a++; }
};


B : function () {}

B.prototype = new A;

Now, I would like to define a getter/setter in B. How do I do that?
There is no way to use the same syntax as in "A.prototype = ..." above.

What you have looks like some pseudo syntax to me,

But it is not entirely. Prototypes of objects inheriting directly
from Object can be defined using an Object literal and getters may
be defined with the `get' keyword before the property identifier:

<http://developer-test.mozilla.org/d...ting_New_Objects:Defining_Getters_and_Setters>

Whether the latter really *works* in an implementation is another issue.
It does work in JavaScript 1.5 as implemented in Mozilla/5.0 (tested
successfully with `Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)
Gecko/20050513 Firefox/1.0.4 (Debian package 1.0.4-1) Mnenhy/0.7.2.0'):

var A = function () {}; // although I'd prefer: function A() {}

A.prototype = {
a: null,
get b() { return this.a++; }
};

var x = new A;
alert(x.b); // 0
alert(x.b); // 1
here is how it works in pratice: [...]

Since the above works in practice as well, I don't see a need to call
the __defineGetter__() method explicitely. Since method calls are
less efficient than variable instantiation, one could probably increase
efficiency with my approach.

What of course does not work is having `a' as identifier for both the
non-function property and the getter; identifiers have to be unique
within a scope.


PointedEars
 

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

Forum statistics

Threads
473,995
Messages
2,570,225
Members
46,815
Latest member
treekmostly22

Latest Threads

Top