Javascript 检查子类是否具有构造函数

Javascript 检查子类是否具有构造函数,javascript,constructor,instance,Javascript,Constructor,Instance,这是我关于Stackoverflow的第一个问题,如果我做错了什么,请不要像推土机一样碾过我: 我需要知道在JavaScript类中是否可能知道,孩子是否提供了构造函数 例如 预期输出:子级具有构造函数:false Vs: 预期输出:子级具有构造函数:true 背景:我希望有一个类在扩展时的行为与直接使用时的行为不同。 因为Childs应该为父类提供与直接使用时不同的信息。您可以向父构造函数添加一个默认为false的参数,然后在调用子类中的super时,为该参数传递true 班级家长{ 构造函

这是我关于Stackoverflow的第一个问题,如果我做错了什么,请不要像推土机一样碾过我:

我需要知道在JavaScript类中是否可能知道,孩子是否提供了构造函数

例如

预期输出:子级具有构造函数:false

Vs:

预期输出:子级具有构造函数:true

背景:我希望有一个类在扩展时的行为与直接使用时的行为不同。
因为Childs应该为父类提供与直接使用时不同的信息。

您可以向父构造函数添加一个默认为false的参数,然后在调用子类中的super时,为该参数传递true

班级家长{ 构造函数调用=false{ console.log'Child具有构造函数:',调用 } } 类子级扩展父级{ 建造师{ 超真实 } } 类ChildTwo扩展了父{} 新生儿
new ChildTwo您可以向父构造函数添加一个默认为false的参数,然后在子类中调用super时,为该参数传递true

班级家长{ 构造函数调用=false{ console.log'Child具有构造函数:',调用 } } 类子级扩展父级{ 建造师{ 超真实 } } 类ChildTwo扩展了父{} 新生儿 新生儿2不,不可能

JavaScript中的类语法只是普通函数的语法提示

以ES6为例:

班级家长{ 构造函数值{ 这个例子=值; } 父方法{ log'parent:',this.example; } } 类子级扩展父级{ 儿童法{ log'children:',this.example; } } const parent=new parent'Hello'; const child=新儿童“世界”; parent.parentMethod; child.childMethod; console.logparent.constructor; console.logchild.constructor 不,不可能

JavaScript中的类语法只是普通函数的语法提示

以ES6为例:

班级家长{ 构造函数值{ 这个例子=值; } 父方法{ log'parent:',this.example; } } 类子级扩展父级{ 儿童法{ log'children:',this.example; } } const parent=new parent'Hello'; const child=新儿童“世界”; parent.parentMethod; child.childMethod; console.logparent.constructor; console.logchild.constructor; 我需要知道在JavaScript类中是否可能知道,孩子是否提供了构造函数

没有没有构造函数的类。有些类可能有一个隐式构造函数,但在类语法中没有构造函数,但是您不能也不应该检测到它

我希望有一个类在扩展时的行为与直接使用时的行为不同

您可以使用区分新的子调用和新的父调用

Childs应向家长提供与直接使用不同的信息

那是个坏主意。您的父构造函数应该有一个不关心谁在使用它的接口。我建议两个都去

永远不要直接使用父类,而是自己扩展它,并为默认使用提供该类。它可以处理不同的信息。 使父类接受不同类型的信息,即重载其接口。区分你得到的信息,并相应地行动。但是,信息是由用户直接提供还是由子类生成并不重要。 我需要知道在JavaScript类中是否可能知道,孩子是否提供了构造函数

没有没有构造函数的类。有些类可能有一个隐式构造函数,但在类语法中没有构造函数,但是您不能也不应该检测到它

我希望有一个类在扩展时的行为与直接使用时的行为不同

您可以使用区分新的子调用和新的父调用

Childs应向家长提供与直接使用不同的信息

那是个坏主意。您的父构造函数应该有一个不关心谁在使用它的接口。我建议两个都去

永远不要直接使用父类,而是自己扩展它,并为默认使用提供该类。它可以处理不同的信息。 使父类接受不同类型的信息,即重载其接口。区分你得到的信息,并相应地行动。但是,信息是由用户直接提供还是由子类生成并不重要。
但是这样我就不能将父类独立地用于其他用途了,对吗?例如,如果我希望用户提供一个对象作为参数。您可以单独使用parent,const parent=new parent,唯一的问题是如果您想传递更多参数

对父母来说,这就是我想做的。如果直接使用Parent,则其行为与扩展时不同。如果需要,可以将父构造函数声明为类Parent{constructor{called=false,…args}={}{{console.logcalled,args}},然后可以使用所需的参数,还可以从childrenMhh传递{called:true}。对象方法可能会起作用。我将尝试一下并给出我的反馈:但是这样我就不能独立地将父类用于其他用途了,对吗?例如,如果我希望用户提供一个对象作为参数。您可以独立使用parent,const parent=new parent,唯一的问题是您是否希望向parenty传递更多参数。这就是我想要做的。如果直接使用Parent,则其行为与扩展时不同。如果需要,可以将父构造函数声明为类Parent{constructor{called=false,…args}={}{{console.logcalled,args}},然后可以使用所需的参数,还可以从childrenMhh传递{called:true}。对象方法可能会起作用。我将尝试一下并给出反馈:我能想到的唯一方法是使用.toString并检查该类是否有构造函数:/Ok是的,我担心:/it不可能。可能一个类实际上就是一个构造函数。我能想到的唯一方法是使用.toString并检查该类是否有构造函数:/Ok是的,我担心:/it不可能。可能一个类实际上就是一个构造函数,这正是我所担心的。感谢您的解释:Ps:Using.toString虽然很难看,但仍然可以工作,对吗?在Parent:console.log中使用它!!this.constructor.toString.match/constructor\s*\/@Freefant no它不会工作,因为1这个孩子可能有类似const constructor='hello'的东西,然后你会得到一个假阳性,2当你使用babel或类似的东西传输代码时,.toString可能会根据transpiler的输出为您提供不同的值。这正是我所担心的。感谢您的解释:Ps:Using.toString虽然很难看,但仍然可以工作,对吗?在Parent:console.log中使用它!!this.constructor.toString.match/constructor\s*\/@Freefant no它不起作用,因为1这个孩子可能有类似const constructor='hello'的东西,然后你会得到一个假阳性,2当你使用babel或类似的东西传输代码时,.toString可能会根据传输程序的输出给你一个不同的值。
class Parent {
  constructor() {
    console.log('Child has constructor:', /* Magic here */)
  }
}

class Child extends Parent {}

new Child()
class Parent {
  constructor() {
    console.log('Child has constructor:', /* Magic here */)
  }
}

class Child extends Parent {
  constructor() {
    super()
  }
}

new Child()