Where is " context of your child object"? On Thu, Dec 23, 2010 at 6:37 PM, Dmitry A. Soshnikov <[email protected]> wrote: > > On 23.12.2010 11:37, Yu-Hsuan Lai wrote: > > 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; > > Yes, this exactly one of the differences. In a class-based system all > properties are copied to the class descendant (even if some of them are not > needed at deeper classes). In a prototype-based system the state (properties) > as well as behavior (methods) are inherited. > > But if the object is very "big"? Write a function to assign all variants? Is > it "constructor"? > > A constructor is used to generate (usually more than one) objects of a needed > "classification" (a "classification" tag which may help to distinguish one > object from another is stored usually in the inherited `constructor` property > of an object, e.g. a.constructor == A ? where `A` is a constructor of `a` > instance). It's a factory which generates the objects. If you need only one > unclassified object, there is no big need in the constructor. You may use > e.g. an object initialiser to create an object: a = {}. To inherit from > another, you (as you know) may use Object.create(proto, [props]). > > To create an own state in this case, yes, you should manually copy needed > properties to the child object. In case of using constructor, you may apply > needed function in context of your child object. Though, it isn't differ much > from the same manual creation of needed own properties -- in any case you > describe them in the parent constructor. > > > Once I implement these all, my prototypal OO still is different from > classical OO? > > No so much. You may generate (with constructors) and "classify" (with > classification tag -- the property "constructor") your objects. You don't > inherit the state but have the own one for child objects. You inherit methods > with linear systematized chain. It's a class-based system. I.e. with a > prototype-based system it's easy to implement the class-based system. But not > a vice-versa. > > Dmitry. > > 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] >> >> >> >> -- >> 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] > > > > -- > 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] > > -- > 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]
-- 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]
