In fact, even though I just want some public variants, I still have the same
problem.
var obj = {a:1,b:2,c:3 ... some methods...};
obj2 = Object.create(obj);
obj2.a is referred to obj.a, right? If I want another instance, I have to
write obj2.a = 1;
But if the object is very "big"? Write a function to assign all variants? Is
it "constructor"?
Once I implement these all, my prototypal OO still is different from
classical OO?On Thu, Dec 23, 2010 at 3:14 PM, אריה גלזר <[email protected]> wrote: > This is exacatly the point - you create the methods and the variable > together, so either you get a copy of all of them, or you get a new > instance. > But if you want a 'private' variable for each instance, the only way you > are going to achieve this (I think) is by creating a separate closure for > each object creation. So you can either do the above second solution, or you > can do > var obj = { > getA : function getA() { > return this.a; > }, > setA : function setA(b) { > a = this.b; > } > }; > > function F(){ this.a = 'a';} > for (i =0; i<10;i++) x.push((function(){ F.prototype = obj; return new > F();})(); > > And you will still be exposing a in the end. But the point is, this is much > less readable and performance-wise I don't think it really matters, so your > second pattern is good enough IMO. > > note - this list beeing so heavy on js wizards, I'm always a little afraid > of posting comments here... > > > On Thu, Dec 23, 2010 at 8:23 AM, Yu-Hsuan Lai <[email protected]> wrote: > >> I'm trying use prototypal inheritance instead of classical one. But I'm >> still confused. >> I can't complete very very very small tasks, like this one: >> Create 10 copies of a object(with a private variant and public functions >> to access it) in an array. >> >> I have two way to approach it, first is to use Object#create: >> var x=[]; >> x[0]=(function () { >> var a=10; >> return { >> getA : function getA() { >> return a; >> }, >> setA : function setA(b) { >> a = b; >> } >> }; >> })(); >> for(var i=1; i<10; i++) >> x[i] = Object.create(x[0]); >> >> But all 10 objects' "a"s refer to a single integer. Tragedy. >> My second way is call a function which return a object 10 times: >> function createX() { >> var a=10; >> return { >> getA : function getA() { >> return a; >> }, >> setA : function setA(b) { >> a = b; >> } >> }; >> } >> var x=[]; >> for(var i=0; i<10; i++) >> x[i] = createX(); >> >> It works. But every x has its own "getA" and "setA" instance. In contrast >> to the former, it costs more memory. >> I know it maybe doesn't matter. But knowing prototypal OO can use only one >> instance, creating 10 let me regard me as a stupid. >> >> Except the two methods, the only one method I can figure out is... >> classical OO. >> Is it avoidable? >> >> >> >> -- >> Lai, Yu-Hsuan >> >> -- >> To view archived discussions from the original JSMentors Mailman list: >> http://www.mail-archive.com/[email protected]/ >> >> To search via a non-Google archive, visit here: >> http://www.mail-archive.com/[email protected]/ >> >> To unsubscribe from this group, send email to >> [email protected]<jsmentors%[email protected]> >> > > > > -- > Arieh Glazer > אריה גלזר > 052-5348-561 > http://www.arieh.co.il > http://www.link-wd.co.il > > -- > To view archived discussions from the original JSMentors Mailman list: > http://www.mail-archive.com/[email protected]/ > > To search via a non-Google archive, visit here: > http://www.mail-archive.com/[email protected]/ > > To unsubscribe from this group, send email to > [email protected]<jsmentors%[email protected]> > -- Lai, Yu-Hsuan -- To view archived discussions from the original JSMentors Mailman list: http://www.mail-archive.com/[email protected]/ To search via a non-Google archive, visit here: http://www.mail-archive.com/[email protected]/ To unsubscribe from this group, send email to [email protected]
