How to show the delegated `constructor` reference issue in javascript? -
in example below noticed comment "fixes delegated constructor reference" , i'm curious -how can show "not working / working after add line of javascript?
full gist here => https://gist.github.com/getify/5572383
thank in advance
function foo(who) { this.me = who; } foo.prototype.identify = function() { return "i " + this.me; }; function bar(who) { foo.call(this,"bar:" + who); } bar.prototype = object.create(foo.prototype); bar.prototype.constructor = bar; // "fixes" delegated `constructor` reference
functions in javascript objects. when create function foo
in javascript, interpreter automatically creates prototype
property foo.prototype
, object. interpreter creates constructor
property on object refers foo
itself:
console.log(foo.prototype.constructor); // reference foo; console.log(foo.prototype.hasownproperty("constructor")); // true;
this same process takes place when create bar
function. later introduce difference. difference manually overwrite object @ bar.prototype
code:
bar.prototype = object.create(foo.prototype);
now bar.prototype
has new object created manually. new object not have constructor
property because created , not interpreter:
console.log(bar.prototype.hasownproperty("constructor")); // false
so bar.prototype
not have own constructor
property foo.prototype
does. next, imagine create instance of bar
:
var mybar = new bar();
mybar.constructor
inherited property not exist on mybar
object. if try access it, javascript interpreter searches prototype chain constructor
property. not find 1 on bar.prototype
because overwrote object. interpreter continues searching , finds property on foo.prototype
. result, reference mybar.constructor
refer foo.prototype.constructor
, contains reference foo
:
console.log(mybar.constructor); // reference foo
so why explicitly set bar.prototype.constructor
manually, when traversing prototype chain, interpreter find constructor
property on bar.prototype
have if hadn't overwritten it:
bar.prototype.constructor = bar;
the end result more useful behavior on our objects:
var mybar2 = new bar(); console.log(mybar2.constructor); // reference bar
this issue should not come rare 1 need check constructor
property of object.
Comments
Post a Comment