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]