Javascript 在调用 super 之前初始化 class 属性
Javascript init class properties before calling super
我正在尝试将我的 javascript class 从旧风格转换为新风格。问题是,新样式 JavaScript 要求在访问 this
之前调用构造函数 super
。我必须扩展一个我不是其所有者的 class,并且在该构造函数中它调用一个方法,我在使用自己的属性的地方覆盖该方法。如何解决?
class A {
constructor() {
this.create()
}
create() {}
reload() {
this.create()
}
}
class B extends A {
constructor(options) {
super()
this.options = options
}
create() {
let title = this.options.title // TypeError: Cannot read properties of undefined (reading 'title')
}
}
我会将原型的 create
设为 no-op,然后在 super()
完成后调用一个函数。
class A {
constructor() {
this.create()
}
create() {}
}
class B extends A {
constructor(options) {
super()
this.options = options
this.createB();
}
createB() {
const title = this.options.title;
console.log(title);
}
create() {}
}
new B({ title: 'foo' });
我想你也可以在超级运行后分配给 .create
,将它从 no-op 变回你想要的功能。
class A {
constructor() {
this.create()
}
create() {}
}
function createB() {
}
class B extends A {
constructor(options) {
super()
this.options = options
this.create = () => {
const title = this.options.title;
console.log(title);
};
this.create();
}
create() {}
}
new B({ title: 'foo' });
我会在 B 的 create
中添加一个守卫,并让它的构造函数再次执行它:
class A {
constructor() {
this.create();
}
create() {
console.log("I don't want to run this");
}
reload() {
this.create();
}
}
class B extends A {
constructor(options) {
super();
this.options = options;
this.create(); // ... but now
}
create() {
if (!this.hasOwnProperty("options")) return; // not now...
let title = this.options.title;
console.log("title", title);
}
}
let b = new B({ title: "my title" });
console.log("let's reload");
b.reload();
我正在尝试将我的 javascript class 从旧风格转换为新风格。问题是,新样式 JavaScript 要求在访问 this
之前调用构造函数 super
。我必须扩展一个我不是其所有者的 class,并且在该构造函数中它调用一个方法,我在使用自己的属性的地方覆盖该方法。如何解决?
class A {
constructor() {
this.create()
}
create() {}
reload() {
this.create()
}
}
class B extends A {
constructor(options) {
super()
this.options = options
}
create() {
let title = this.options.title // TypeError: Cannot read properties of undefined (reading 'title')
}
}
我会将原型的 create
设为 no-op,然后在 super()
完成后调用一个函数。
class A {
constructor() {
this.create()
}
create() {}
}
class B extends A {
constructor(options) {
super()
this.options = options
this.createB();
}
createB() {
const title = this.options.title;
console.log(title);
}
create() {}
}
new B({ title: 'foo' });
我想你也可以在超级运行后分配给 .create
,将它从 no-op 变回你想要的功能。
class A {
constructor() {
this.create()
}
create() {}
}
function createB() {
}
class B extends A {
constructor(options) {
super()
this.options = options
this.create = () => {
const title = this.options.title;
console.log(title);
};
this.create();
}
create() {}
}
new B({ title: 'foo' });
我会在 B 的 create
中添加一个守卫,并让它的构造函数再次执行它:
class A {
constructor() {
this.create();
}
create() {
console.log("I don't want to run this");
}
reload() {
this.create();
}
}
class B extends A {
constructor(options) {
super();
this.options = options;
this.create(); // ... but now
}
create() {
if (!this.hasOwnProperty("options")) return; // not now...
let title = this.options.title;
console.log("title", title);
}
}
let b = new B({ title: "my title" });
console.log("let's reload");
b.reload();