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