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] <mailto:[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]
    <mailto:[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]
        <mailto: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]
    <mailto: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]

--
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