ps:此问题是我在浏览了https://forum.cocos.org/t/topic/113695后提出的。
ps:cocoscreator 3.2版本(3以上应该都一样)
简单的代码演示(注意了,不要管代码是否有意义,不要管代码是否有意义,不要管代码是否有意义,重要的事情说三遍)
main.ts
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
class TestClass1 {
age1?: number;
constructor() {
this.init();
}
init() {
this.age1 = 10;
console.log(`age1:${this.age1}`);
}
}
class TestClass2 extends TestClass1 {
age2?: number;
constructor() {
super();
}
init() {
super.init();
this.age2 = 100;
console.log(`age2:${this.age2}`);
}
}
@ccclass('Main')
export class Main extends Component {
start() {
let test2 = new TestClass2();
//当前=>useDefineForClassFields 打开或者关闭 输出都是undefined
//期望=>关闭的时候 正常输出100
console.log(test2.age2);
}
}
注意看下编译出来的代码(仅挑选 TestClass2
编译代码)
1.useDefineForClassFields=true
TestClass2 = /*#__PURE__*/function (_TestClass) {
_inheritsLoose(TestClass2, _TestClass);
function TestClass2() {
var _this;
_this = _TestClass.call(this) || this;
_defineProperty(_assertThisInitialized(_this), "age2", void 0);//此处是重点
return _this;
}
var _proto2 = TestClass2.prototype;
_proto2.init = function init() {
_TestClass.prototype.init.call(this);
this.age2 = 100;
console.log("age2:" + this.age2);
};
return TestClass2;
}(TestClass1);
2.useDefineForClassFields=false
TestClass2 = /*#__PURE__*/function (_TestClass) {
_inheritsLoose(TestClass2, _TestClass);
function TestClass2() {
var _this;
_this = _TestClass.call(this) || this;
_this.age2 = void 0;//此处是重点
return _this;
}
var _proto2 = TestClass2.prototype;
_proto2.init = function init() {
_TestClass.prototype.init.call(this);
this.age2 = 100;
console.log("age2:" + this.age2);
};
return TestClass2;
}(TestClass1);
3.随意创建一个typescript项目且useDefineForClassFields=false
var TestClass2 = /** @class */ (function (_super) {
__extends(TestClass2, _super);
function TestClass2() {
return _super.call(this) || this;
//此处没有代码
}
TestClass2.prototype.init = function () {
_super.prototype.init.call(this);
this.age2 = 100;
console.log("age2:" + this.age2);
};
return TestClass2;
}(TestClass1));
重点来了
按我理解 2应该跟3一样不生成 _this.age2 = void 0
才对。
但是基于何种考虑,官方的编译器生成了这句代码?可以给我解惑一下吗。