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]

Reply via email to