The constructor
property is just a convention in JavaScript (that's no longer true as of ES2015); it points to the function that is associated with the prototype on which the constructor
property exists. That's a bit of a convoluted sentence, so: Assume a function Foo
. Foo.prototype.constructor
will be Foo
. Similarly, assuming var f = new Foo();
, f.constructor
will be Foo
.
It's not actually used for anything in the JavaScript standard. (It is as of ES2015, for things like various Promise
methods.) It's just a convention that, unless someone messes it up (which is easy to do), an object will have a constructor
property it inherits from its prototype that is the function used to create it.
I say it's easy to break that because, well, it is, and people frequently do. Here's an example of breaking it:
function Foo() {
}
Foo.prototype = {
bar: function() {
}
};
var f = new Foo();
console.log(f.constructor === Foo); // false
The code you've quoted is very unusual for JavaScript:
Most importantly, it breaks a hugely important rule: You don't change properties on the prototype from within the constructor (except in very edge-case scenarios). (Although in this particular case, it does so in a harmless but pointless way.)
It breaks a fundamental naming rule in JavaScript: That constructor functions start with a capital letter (Obj
, not obj
).
And it shows an all-too-common, but fundamentally broken, pattern for setting up inheritance hierarchies.
So on the whole, I would probably not use whatever resource it was that you got that code from.
FWIW, here's a corrected version of that code:
function Base() {
this.str = "hello world!.";
}
Base.prototype.printTxt = function () {
console.log(this.str);
};
function Derived() {
this.str = "Good bye";
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
Object.create
was defined by ECMAScript5. This single-argument version of it can be shimmed for older engines (the multi-argument version of it cannot be), like this:
if (!Object.create) {
Object.create = function(proto) {
if (arguments.length > 1) {
throw "The multi-argument version of Object.create cannot be shimmed.";
}
function ctor() { }
ctor.prototype = proto;
return new ctor();
};
}