JavaScript - Class 根据条件延长
JavaScript - Class extend on condition
事情是这样的。我有一个名为 A 的主 class。
我希望这个 class 扩展 class B.
class A extends B {}
但实际上,我希望 class B 在特定条件下扩展 C、D 或 E:
class B extends B1 {}
或
class B extends B2 {}
或
class B extends B3 {}
所以Bclass会是一个"fake"class,只是检查一个条件然后向右扩展class。
在决赛中,结果将与:
class A extends B1 {}
或
class A extends B2 {}
或
class A extends B3 {}
我知道这在 PHP 中是可能的,例如抽象 classes 或包装器 classes。
但是如何在 JavaScript ES6 中做到这一点?
谢谢
所以 javascript 中的 类 确实没有以与其他语言相同的经典继承方式设置,做你想做的最好的方法是设置你正在处理的对象的原型和。有几种方法。
Object.setPrototypeOf(currentObj, newPrototype);
其中 newPrototype 是您要继承的对象。如果您想了解内部工作原理,这里有几篇不错的文章。
http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/
https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md
奇怪,但可能:
class subClassFirst {
report() {
console.log(`Extended ${this.name} from the first class`);
}
}
class subClassSecond {
report() {
console.log(`Extended ${this.name} from the second class`);
}
}
class subClassThird {
report() {
console.log(`Extended ${this.name} from the third class`);
}
}
function classCreator(condition) {
let sub;
switch (condition) {
case 'first':
sub = subClassFirst;
break;
case 'second':
sub = subClassSecond;
break;
case 'third':
sub = subClassThird;
break;
}
return (class extends sub {
constructor(name) {
super();
this.name = name;
}
});
}
let myClass;
myClass = classCreator('first');
let mcf = new myClass('f');
myClass = classCreator('second');
let mcs = new myClass('s');
myClass = classCreator('third');
let mct = new myClass('t');
mcf.report();
mcs.report();
mct.report();
有一个用于此的 Node JS 函数
const util = require("util");
class MySubClass {}
class MySuperClass {}
util.inherits(MySubClass, MySuperClass);
我发现博客 post 提供了一种不使用 util.inherits
的简单 es6 方法
https://www.mikedoesweb.com/2017/dynamic-super-classes-extends-in-es6/
以下是我如何使用传递的选项来确定要扩展的 class,然后在导出
中对其进行混淆
import ClassB from ' '
import ClassA from ' '
const ext = {
classA: ClassA, // the default
classB: ClassB
// can do as many as you want
}
function ExtendsMyClass (opts= {}) {
if (!new.target) {
throw new Error('Uncaught TypeError: Class constructor Interrupt cannot be invoked without \'new\'')
}
// one could vet opts here too including opts.extend
class MyClass extends ext[opts.extend || 'classA'] {
constructor(opts = {}) {
super(opts)
....
}
} // end MyClass
return new MyClass(opts)
} // end dynamic extend
export default ExtendsMyClass
export { ExtendsMyClass as MyClass }
我可能会把它变成“包装器”实用函数,它也接受子 class。这样一来,就可以动态扩展任何 class,而不是上面的一次性实现。如果设置了异步函数,甚至可以实现动态导入。
事情是这样的。我有一个名为 A 的主 class。 我希望这个 class 扩展 class B.
class A extends B {}
但实际上,我希望 class B 在特定条件下扩展 C、D 或 E:
class B extends B1 {}
或
class B extends B2 {}
或
class B extends B3 {}
所以Bclass会是一个"fake"class,只是检查一个条件然后向右扩展class。 在决赛中,结果将与:
class A extends B1 {}
或
class A extends B2 {}
或
class A extends B3 {}
我知道这在 PHP 中是可能的,例如抽象 classes 或包装器 classes。 但是如何在 JavaScript ES6 中做到这一点?
谢谢
所以 javascript 中的 类 确实没有以与其他语言相同的经典继承方式设置,做你想做的最好的方法是设置你正在处理的对象的原型和。有几种方法。
Object.setPrototypeOf(currentObj, newPrototype);
其中 newPrototype 是您要继承的对象。如果您想了解内部工作原理,这里有几篇不错的文章。
http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/
https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md
奇怪,但可能:
class subClassFirst {
report() {
console.log(`Extended ${this.name} from the first class`);
}
}
class subClassSecond {
report() {
console.log(`Extended ${this.name} from the second class`);
}
}
class subClassThird {
report() {
console.log(`Extended ${this.name} from the third class`);
}
}
function classCreator(condition) {
let sub;
switch (condition) {
case 'first':
sub = subClassFirst;
break;
case 'second':
sub = subClassSecond;
break;
case 'third':
sub = subClassThird;
break;
}
return (class extends sub {
constructor(name) {
super();
this.name = name;
}
});
}
let myClass;
myClass = classCreator('first');
let mcf = new myClass('f');
myClass = classCreator('second');
let mcs = new myClass('s');
myClass = classCreator('third');
let mct = new myClass('t');
mcf.report();
mcs.report();
mct.report();
有一个用于此的 Node JS 函数
const util = require("util");
class MySubClass {}
class MySuperClass {}
util.inherits(MySubClass, MySuperClass);
我发现博客 post 提供了一种不使用 util.inherits
的简单 es6 方法
https://www.mikedoesweb.com/2017/dynamic-super-classes-extends-in-es6/
以下是我如何使用传递的选项来确定要扩展的 class,然后在导出
中对其进行混淆import ClassB from ' '
import ClassA from ' '
const ext = {
classA: ClassA, // the default
classB: ClassB
// can do as many as you want
}
function ExtendsMyClass (opts= {}) {
if (!new.target) {
throw new Error('Uncaught TypeError: Class constructor Interrupt cannot be invoked without \'new\'')
}
// one could vet opts here too including opts.extend
class MyClass extends ext[opts.extend || 'classA'] {
constructor(opts = {}) {
super(opts)
....
}
} // end MyClass
return new MyClass(opts)
} // end dynamic extend
export default ExtendsMyClass
export { ExtendsMyClass as MyClass }
我可能会把它变成“包装器”实用函数,它也接受子 class。这样一来,就可以动态扩展任何 class,而不是上面的一次性实现。如果设置了异步函数,甚至可以实现动态导入。