有没有办法发现javascript 6类是否定义了自己的构造函数?

时间:2015-07-09 18:10:59

标签: javascript constructor ecmascript-6

有没有办法确定子类是否在静态方法(基类)中实现构造函数?

我试图编写一个静态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;
        }
    }
}

这甚至可能吗?

2 个答案:

答案 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(){ }

如果没有。结果无法与显式声明此类构造函数的类区分开来。