Source code
Revision control
Copy as Markdown
Other Tools
var count = 0;
function Parent() {
// Scanning "this" properties here with Object.keys() solved the bug in my case
//Object.keys(this);
this.log('Parent ctor');
this.meth1();
this.log('data3 before : ' + this.data3);
this.meth2();
// Added properties lost in ChildA
this.log('data3 after : ' + this.data3);
this.log('');
if (count++)
assertEq(this.data3, 'z');
}
Parent.prototype.meth1 = function () {
this.log('Parent.meth1()');
};
Parent.prototype.meth2 = function () {
this.log('Parent.meth2()');
// Requirement for the bug : Parent.meth2() needs to add data
this.data4 = 'x';
};
Parent.prototype.log = function (data) {
print(data);
}
// Intermediate constructor to instantiate children prototype without executing Parent constructor code
function ParentEmptyCtor() { }
ParentEmptyCtor.prototype = Parent.prototype;
function ChildA() {
this.log('ChildA ctor');
Parent.call(this);
}
ChildA.prototype = new ParentEmptyCtor();
// Using Object.create() instead solves the bug
//ChildA.prototype = Object.create(ParentEmptyCtor.prototype);
ChildA.prototype.constructor = ChildA;
ChildA.prototype.meth1 = function () {
this.log('ChildA.meth1()');
this.data3 = 'z';
};
ChildA.prototype.meth2 = function () {
this.log('ChildA.meth2()');
};
function ChildB() {
this.log('ChildB ctor');
Parent.call(this);
}
ChildB.prototype = new ParentEmptyCtor();
//ChildB.prototype = Object.create(ParentEmptyCtor.prototype);
ChildB.prototype.constructor = ChildB;
function demo() {
// Requirement for the bug : ChildB needs to be instantiated before ChildA
new ChildB();
new ChildA();
}
demo();