javascript - Inheritance from native objects -


i seem miss constructor chain inheritance in javascript, native objects. example :

function errorchild(message) { error.call(this, message); } errorchild.prototype = object.create(error.prototype); var myerror = new errorchild("help!"); 

why myerror.message defined "" after statements ? expect error constructor define "help!" (and override default value of error.prototype.message), if doing :

var myerror = new error("help!") 

thanks lot !

the simple work-around: working fiddle

function errorchild(name, message) {     // error.call(this); not needed     this.name = name;     this.message = message; }  errorchild.prototype = object.create(error.prototype); errorchild.prototype.constructor = errorchild;  var myerror = new errorchild("test", "help!"); document.body.innerhtml += myerror.message; 

the above doesn't break expected behaviour. when throw myerror, correct name , message display.

the problem

from ecma5 language specification:

15.11.1 error constructor called function

when error called function rather constructor, creates , initialises new error object. function call error(...) equivalent object creation expression new error(...) same arguments.

the problem: error.call(this), equivalent of new error. new error instantiation not set name or message. new error initialise message "" default.

15.11.4.3 error.prototype.message # Ⓣ Ⓡ initial value of error.prototype.message empty string.

test(proof)

if inside errorchild add:

var test = error.call(this, message); console.dir(test); console.log(test instanceof error); // true; console.log(test.message); // "help!"; 

the test reflects ecma5 spec. error instance proper message set.

conclusion:

because error.call(arguments); gets automatically translated new error(arguments); scope lost, properties never initialised on this object.

when object.create(error.prototype) used, message property takes default value, empty string.


Comments

Popular posts from this blog

c# - DetailsView in ASP.Net - How to add another column on the side/add a control in each row? -

javascript - firefox memory leak -

Trying to import CSV file to a SQL Server database using asp.net and c# - can't find what I'm missing -