Romantic Electron
Romantic Electron

Reputation: 779

Why this behaviour?__proto__ vs prototype?

    function Obj1(name){
        this.__proto__={
            Name:name,
            getName:function(){
                alert(this.Name); 
            }


        };

    }

    function Obj2(name){
       this.prototype={
           Name:name,
           getName:function(){
           alert(this.Name); 
           };


       };

    }
    x=new Obj1("blue shark");
    z=new Obj2("red shark");
    x.getName();
    z.getName();// error:z.getName() is not a function

What is the difference between the two?Some say prototype is used for constructor functions only but in this case it doesn't work.... instead the __proto__ work why?

Upvotes: 2

Views: 269

Answers (3)

6502
6502

Reputation: 114511

__proto__ is not a standard property.

Anyway every object created by new will get a prototype from the .prototype member of the constructor (a function). Note that the prototype member has no name, you cannot access it directly, you need Object.getPrototypeOf(x).

If you want to create an object with a given prototype the code is Object.create(proto) that is more or less equivalent to

function makeObjectWithPrototype(x) {
    function makeit() { }
    makeit.prototype = x;
    return new makeit();
}

Upvotes: 2

Benjamin Gruenbaum
Benjamin Gruenbaum

Reputation: 276306

__proto__ (which is not standard (but might be soon))) sets an object's prototype.

.prototype sets the prototype of objects created by invoking the function it was set on as a constructor using new

Also worth mentioning is Object.create

Here are examples:

Pseudo-classical with .prototype:

function Car(){
   this.x = 15;
}
Car.prototype.y = 10;

var g = new Car();
g.y; // this is 10;

Using __proto__ (don't use this!):

var g = {x:15};
g.__proto__ = {y:10};
g.y; // this is 10;

This way is correct, and does not use constructors with new:

var g = Object.create({y:10}); //creates x with prototype {y:10}
g.x = 15;
g.y; // this is 10

Here is an interesting tutorial on MDN covering these.

Upvotes: 5

xdazz
xdazz

Reputation: 160853

Only functions has the property prototype. You need to set the prototype on the function self.

function Obj2(name){
    this.name = name;
}

Obj2.prototype={
    getName:function(){
       alert(this.Name); 
    }
};

Upvotes: 2

Related Questions