Good point, also, jslint will warn you “missing ‘new’ prefix when invoking a 
constructor”

From: jsmentors@googlegroups.com [mailto:jsment...@googlegroups.com] On Behalf 
Of Dmitry A. Soshnikov
Sent: Thursday, December 23, 2010 10:44 AM
To: jsmentors@googlegroups.com
Subject: Re: [JSMentors] Still confused with prototypal OO

Yes, right. This, btw, is fixed in the strict mode.

Dmitry.

On 23.12.2010 18:28, Joel Dart wrote:
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: jsmentors@googlegroups.com<mailto:jsmentors@googlegroups.com> 
[mailto:jsment...@googlegroups.com] On Behalf Of Caires Vinicius
Sent: Thursday, December 23, 2010 10:04 AM
To: jsmentors@googlegroups.com<mailto: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<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<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

Reply via email to