new foo.prototype.bar(x,y,z ) ?

Discussion in 'Javascript' started by kj, Jan 27, 2008.

  1. kj

    kj Guest

    OK, here's another construct I've run into in the jQuery source
    that I can't figure out. It looks like this:

    return new jQuery.prototype.init( selector, context );

    So basically, as far as I can tell, the returned value has the form

    new obj.prototype.method( args );

    (In addition, FWIW, the function jQuery.prototype.init has several
    explict return statements which, as far as I can tell, all end up
    returning "this".)

    What I find most confusing here is that when I check the constructor
    property of the newly created object I find that it is *not*
    jQuery.prototype.init. I.e. the boolean expression

    ( new jQuery.prototype.init( selector, context ) ).constructor
    === jQuery.prototype.init

    evaluates to *false*. Even if I test the value of this.constructor
    at a breakpoint right at the top of jQuery.prototype.init, what I
    get is Object, not jQuery.prototype.init. Contrast this behavior
    with

    function Foo () {
    alert( this.constructor === Foo );
    }
    x = new Foo();

    In this case the alert dialog will display "true", as one would
    expect.

    I've tried many different variants of this test and I have never
    been able to replicate the situation in which the constructor
    property of the this object in the scope of a function that has
    been called using the new keyword is anything other than the function
    in question. These tests included the case in which the function
    explicitly returns the this object. (I even ran some of these
    tests in SpiderMonkey running on Linux to rule out the possibility
    that what I was seeing was either a Firebug artefact or a quirk in
    the Firefox implementation of Javascript. I got the same results.)

    This is utterly baffling to me...

    If anyone can explain to me what's going on I'd appreciate it!

    Thanks!

    Kynn

    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
    kj, Jan 27, 2008
    #1
    1. Advertising

  2. kj

    Guest

    On Jan 28, 9:54 am, kj <> wrote:
    > OK, here's another construct I've run into in the jQuery source
    > that I can't figure out. It looks like this:
    >
    > return new jQuery.prototype.init( selector, context );
    >
    > So basically, as far as I can tell, the returned value has the form
    >
    > new obj.prototype.method( args );
    >
    > (In addition, FWIW, the function jQuery.prototype.init has several
    > explict return statements which, as far as I can tell, all end up
    > returning "this".)
    >
    > What I find most confusing here is that when I check the constructor
    > property of the newly created object I find that it is *not*
    > jQuery.prototype.init. I.e. the boolean expression
    >
    > ( new jQuery.prototype.init( selector, context ) ).constructor
    > === jQuery.prototype.init
    >
    > evaluates to *false*. Even if I test the value of this.constructor
    > at a breakpoint right at the top of jQuery.prototype.init, what I
    > get is Object, not jQuery.prototype.init. Contrast this behavior
    > with
    >
    > function Foo () {
    > alert( this.constructor === Foo );
    > }
    > x = new Foo();
    >
    > In this case the alert dialog will display "true", as one would
    > expect.
    >
    > I've tried many different variants of this test and I have never
    > been able to replicate the situation in which the constructor
    > property of the this object in the scope of a function that has
    > been called using the new keyword is anything other than the function
    > in question. These tests included the case in which the function
    > explicitly returns the this object. (I even ran some of these
    > tests in SpiderMonkey running on Linux to rule out the possibility
    > that what I was seeing was either a Firebug artefact or a quirk in
    > the Firefox implementation of Javascript. I got the same results.)
    >
    > This is utterly baffling to me...
    >
    > If anyone can explain to me what's going on I'd appreciate it!
    >
    > Thanks!
    >
    > Kynn
    >
    > --
    > NOTE: In my address everything before the first period is backwards;
    > and the last period, and everything after it, should be discarded.


    Try:
    ( new jQuery.prototype.init( selector, context ) ).constructor
    == jQuery

    and tell me what it says. Specifically, look for the following line of
    code for a reference to the init constructors prototype:
    jQuery.prototype.init.prototype = jQuery.prototype;
    , Jan 27, 2008
    #2
    1. Advertising

  3. kj

    kj Guest

    In <> "" <> writes:

    >Try:
    >( new jQuery.prototype.init( selector, context ) ).constructor
    > == jQuery


    >and tell me what it says.


    Firebug at least reports that boolean expression as false.

    >Specifically, look for the following line of
    >code for a reference to the init constructors prototype:
    >jQuery.prototype.init.prototype = jQuery.prototype;


    I see, but still, the constructor is not jQuery...

    Kynn
    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
    kj, Jan 27, 2008
    #3
  4. kj <> writes:

    > In <> "" <> writes:
    >
    >>Try:
    >>( new jQuery.prototype.init( selector, context ) ).constructor
    >> == jQuery

    >
    >>and tell me what it says.

    >
    > Firebug at least reports that boolean expression as false.
    >
    >>Specifically, look for the following line of
    >>code for a reference to the init constructors prototype:
    >>jQuery.prototype.init.prototype = jQuery.prototype;

    >
    > I see, but still, the constructor is not jQuery...


    As I said in the previous thread, object.constructor is unreliable
    unless the person writing the constructor method has taken care that it
    works.

    You usually don't need it to work anyway, since instanceof works
    better.

    Joost.
    Joost Diepenmaat, Jan 27, 2008
    #4
  5. kj

    kj Guest

    In <> Joost Diepenmaat <> writes:

    >As I said in the previous thread, object.constructor is unreliable
    >unless the person writing the constructor method has taken care that it
    >works.


    >You usually don't need it to work anyway, since instanceof works
    >better.


    But there's one situation in which only constructor could help
    (though it may not), and that is when one wants to find out the
    class of an object. instanceof only helps one test against a
    specific class, but what if one wanted to find out an objects class
    in the first place?

    kynn
    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
    kj, Jan 29, 2008
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jonathan Bartlett
    Replies:
    7
    Views:
    438
    Peter Nilsson
    Jul 8, 2005
  2. Wejn
    Replies:
    2
    Views:
    104
    Michal
    Nov 29, 2003
  3. Max Williams
    Replies:
    10
    Views:
    190
    Max Williams
    Dec 15, 2007
  4. Gunnar Hjalmarsson
    Replies:
    12
    Views:
    269
    Darren Dunham
    Feb 24, 2005
  5. Replies:
    4
    Views:
    124
    Thomas 'PointedEars' Lahn
    Dec 23, 2007
Loading...

Share This Page