On 23.12.2010 14:54, Yu-Hsuan Lai wrote:
Where is " context of your child object"?


It's a /this/ value.

1. Parent constructor:

function A(x) {
  this.x = x;
}

A.prototype.foo = function () {
  return this.x;
};

// and instance of the constructor "A"
var a = new A(10);

// has an own "x" property
alert(a.x);

// and a classification tag "constructor", which
// is an inherited property placed on the prototype
alert(a.constructor === A); // true

2. Child constructor

function B(x, y) {

  // apply the parent constructor
  // in context of the child object
  A.apply(this, arguments);

  // create an own property
  this.y = y;
}

// inherit from A.prototype
B.prototype.__proto__ = A.prototype;

var b = new B(20, 30);

// "b" object has own "x" and "y" properties
alert([b.x, b.y]); // 10, 20

// and "classified" as "B"
alert(b.constructor === B); // true

Notice how "b" got its "x" property via A.apply(this, arguments)? This is called to apply a function in context of the needed object (`this` value references to a newly created object, that is, to "b" at working of B constructor) .

P.S.: notice also, I used non-standard inheritance way with __proto__ to simplify explanation.

Dmitry.

On Thu, Dec 23, 2010 at 6:37 PM, Dmitry A. Soshnikov
<dmitry.soshni...@gmail.com>  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, אריה גלזר<arieh.gla...@gmail.com>  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<rainco...@gmail.com>  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/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com


--
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/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com


--
Lai, Yu-Hsuan
--
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com

--
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com


--
Lai, Yu-Hsuan


--
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com

Reply via email to