Kaarel Purde
Kaarel Purde

Reputation: 1265

Weird behaviour with constructors

Can someone please explain this behaviour to me.

First let's create a constructor and a new object using the constructor:

var MyConstructor = function() {};
var obj = new MyConstructor();

Everything is as expected:

console.log(obj.constructor === MyConstructor); //true
console.log(obj.__proto__ === MyConstructor.prototype); //true

Let's try again, but this time let's add a custom prototype to the constructor:

var MyConstructor2 = function() {};
var myProto = { fld: 'val' };
MyConstructor2.prototype = myProto;
var obj2 = new MyConstructor2();

Now things are not as I expect them to be:

console.log(obj2.constructor === MyConstructor2); //false?!?!
console.log(obj2.constructor === Object); //true, b-but i didnt use Object..
console.log(obj2.__proto__ === MyConstructor2.prototype); //true

Why is obj2.constructor referring to Object and not MyConstructor2?

--- edit1 ---

Just to clarify. If you create a new function:

var MyConstructor = function() {};

then Javascript implementation will also create a new object:

var temp = { constructor: MyConstructor };

and set it to:

MyConstructor.prototype = temp;

The thing to note here is that the temp object overwrites the constructor field from Object.prototype (and by default Object.prototype.constructor === Object).

So when I create a new object using the constructor:

var obj = new MyConstructor();

then the object inherits the constructor field which points to MyConstructor. In the second case there was no overwriting, so the second object inherited the constructor field directly from Object.prototype.

Upvotes: 1

Views: 45

Answers (1)

Greg Burghardt
Greg Burghardt

Reputation: 18783

Each Function object has a prototype property whose "constructor" property is referencing the function. When you create a new prototype using the Object literal syntax, you are created a brand new object whose constructor is literally the Object function. You need to explicitly set the constructor property:

function MyConstructor2() {

}

MyConstructor2.prototype = {
    constructor: MyConstructor2
};

Upvotes: 3

Related Questions