有没有办法确定子类是否在静态方法(基类)中实现构造函数?
我试图编写一个静态create
方法(类似于new
关键字),默认情况下通过将属性值作为属性对象传递来实现:
class Person extends Class {
greet() { return 'hello from ' + this.name; }
}
var p = Person.create({name: 'world'}; // create a new Person object and set its `name` property to `'world'`
console.log(p.greet()); // => "hello from world"
然后交给班级'构造函数,如果它有一个:
class Person2 extends Class {
constructor(name) {
super();
this.name = name;
}
greet() { return 'hello from ' + this.name; }
}
var p = Person2.create('world');
console.log(p.greet()); // => "hello from world"
我一直在寻找子类是否定义了自己的构造函数。
class Class {
static create(...args) {
let has_ctor = ?? // true iff the current subclass defines a constructor..
if (has_ctor) {
// let the constructor handle everything
return new this(...args);
} else {
// assume that `args` contains exactly 1 pojo that defines instance variables to be overridden..
var instance = new this();
let props = args[0];
for (let prop in props) instance[prop] = props[prop];
return instance;
}
}
}
这甚至可能吗?
答案 0 :(得分:1)
似乎更容易做到
class Class {
static create(...args) {
// let the constructor handle everything
return new this(...args);
}
constructor(props){
Object.assign(this, props);
}
}
然后如果事情覆盖了构造函数,那么可以选择将props传递给super()
或者自己手动分配它们。
答案 1 :(得分:1)
回答你原来的问题
有没有办法发现javascript 6类是否定义了自己的构造函数?
否,没有。每个类都有自己的构造函数,因为“class”基本上只是构造函数。
如果类定义不包含constructor
方法,那么它将由语言自动提供(参见§14.5.14);无论是
constructor(...args){ super (...args);}
如果有超类或
constructor(){ }
如果没有。结果无法与显式声明此类构造函数的类区分开来。