new is a bad part primarily because of its dangerous potential for
adding global variables.
Specifically, using the previous example
> function A(x) {
> this.x = x;
> }
>
> A.prototype.foo = function () {
> return this.x;
> };
>
> // and instance of the constructor "A"
> var a = new A(10);
If instead you accidentally forgot new:
var a = A(10);
A would be a normal function call and, inside A, “this” would point to
the global object. You’d create a new global variable x which is
obviously unintended. Using the Object.create pattern you have a
consistent experience and don’t have to validate if you and your
coworkers properly used “new.”
*From:*jsment...@googlegroups.com [mailto:jsment...@googlegroups.com]
*On Behalf Of *Caires Vinicius
*Sent:* Thursday, December 23, 2010 10:04 AM
*To:* jsmentors@googlegroups.com
*Subject:* Re: [JSMentors] Still confused with prototypal OO
I guess what Crockford was trying to show was how to write code that
is more prototype based and less OO.
OO isn't evil but on javascript you should think differently.
Caires Vinicius
On Thu, Dec 23, 2010 at 12:54 PM, Yu-Hsuan Lai <rainco...@gmail.com
<mailto:rainco...@gmail.com>> wrote:
I think I have totally understood your code, but is this the using
"new" which "Good Part" try to avoid?
"An even better coping strategy is to not use new at all."
In fact, I don't regard your classical implementation bad. This is the
reason why I'm so confused.
Is this an "even better strategy"?
var a={x:10};
b=Object.create(a);
b.x = 20;
b.y = 30;
I can't realize its advantages. Crockford gave me am impression: "new
is evil, prototype is beautiful."
(he put "new" in the "bad parts")
Did he exaggerate or I misunderstand him?
(I know in previous post you have tried to answer me... but maybe I'm
not enough clever to understand it)
On Thu, Dec 23, 2010 at 8:13 PM, Dmitry A. Soshnikov
<dmitry.soshni...@gmail.com <mailto:dmitry.soshni...@gmail.com>> wrote:
> 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 <mailto: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
<mailto: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
<mailto: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
<mailto:jsmentors%2bunsubscr...@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
<mailto:jsmentors%2bunsubscr...@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
<mailto:jsmentors%2bunsubscr...@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
<mailto:jsmentors%2bunsubscr...@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
<mailto:jsmentors%2bunsubscr...@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
<mailto:jsmentors%2bunsubscr...@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
<mailto: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