How can I create a new Person object correctly in Javascript?
Posted
by TimDog
on Stack Overflow
See other posts from Stack Overflow
or by TimDog
Published on 2010-05-26T22:38:40Z
Indexed on
2010/05/26
22:51 UTC
Read the original article
Hit count: 316
JavaScript
|closures
I'm still struggling with this concept. I have two different Person objects, very simply:
;Person1 = (function() {
function P (fname, lname) {
P.FirstName = fname;
P.LastName = lname;
return P;
}
P.FirstName = '';
P.LastName = '';
var prName = 'private';
P.showPrivate = function() { alert(prName); };
return P;
})();
;Person2 = (function() {
var prName = 'private';
this.FirstName = '';
this.LastName = '';
this.showPrivate = function() { alert(prName); };
return function(fname, lname) {
this.FirstName = fname;
this.LastName = lname;
}
})();
And let's say I invoke them like this:
var s = new Array();
//Person1
s.push(new Person1("sal", "smith"));
s.push(new Person1("bill", "wonk"));
alert(s[0].FirstName);
alert(s[1].FirstName);
s[1].showPrivate();
//Person2
s.push(new Person2("sal", "smith"));
s.push(new Person2("bill", "wonk"));
alert(s[2].FirstName);
alert(s[3].FirstName);
s[3].showPrivate();
The Person1
set alerts "bill" twice, then alerts "private" once -- so it recognizes the showPrivate
function, but the local FirstName
variable gets overwritten.
The second Person2
set alerts "sal", then "bill", but it fails when the showPrivate
function is called. The new
keyword here works as I'd expect, but showPrivate
(which I thought was a publicly exposed function within the closure) is apparently not public.
I want to get my object to have distinct copies of all local variables and also expose public methods -- I've been studying closures quite a bit, but I'm still confused on this one. Thanks for your help.
© Stack Overflow or respective owner