closure-compiler
closure-compiler copied to clipboard
Advanced compiled code works differently if referencing .constructor
The following code prints [123] in a console, the advanced compiled code prints []. Compilation command: java -jar compiler.jar --language_out ECMASCRIPT5 --js 'test.js' --compilation_level=ADVANCED Compiler version: v20240317
// test.js
const Foo = class {
/** @param {!Array<number>=} opt_nums */
constructor(opt_nums){
/** @type {!Array<number>} */
this.nums_ = opt_nums || [];
}
/** @param {number} num */
add(num){
this.nums_.push(num);
}
/** @return {!Foo} */
clone(){
return new this.constructor(this.nums_.slice(0));
}
}
const f = new Foo();
f.add(123);
console.log(f.clone().nums_);
Compiled code:
function a(){this.g=[]}a.prototype.add=function(e){this.g.push(e)};var b=new a;b.add(123);var c=console,d=c.log,f;f=new b.constructor(b.g.slice(0));d.call(c,f.g);
The opt_nums argument of a constructor is ignored in the compiled code.
Yes, use the "constructor" property is considered reflection. If you would like to use it in that way you need to export or otherwise cause the constructor to "escape".