【问题标题】:JavaScript: How to detect ES6 class has its own constructor?JavaScript:如何检测 ES6 类有自己的构造函数?
【发布时间】:2017-09-08 20:01:48
【问题描述】:

如何检测 EcmaScript 类是否有自己的构造函数? 请参阅下面的代码 sn-p。

class Person {
  constructor(name, age) {   // <- Own constructor
    this._name = name;
    this._age = age;
  }
}


class Manager extends Person {
    // This class does not have it's own constructor
}

似乎没有明确的方法来做这个检查。

感谢大家的时间和帮助。

【问题讨论】:

  • 您能否详细说明拥有“自己的构造函数”意味着什么?您确实知道类不是真实的,对吧,而只是函数及其原型的语法糖?
  • @RayToal,参见示例。我需要以某种方式弄清楚 Person 类有自己的构造函数,而 Manager 类没有。
  • 你能详细说明你为什么要这样做吗?看起来您要求的是访问源代码。在 JavaScript 中,当你说 classconstructor 时,你不是在创建类和构造函数,而是在定义一个函数,并可能在它的原型中添加一些东西。我真的不明白这个问题(虽然很有趣)有什么相关的答案,因为类在 JavaScript 中不是真实的。您是在问是否在运行时可以看到源代码的样子?我认为没有重大黑客攻击是不可能的......
  • @RayToal,你是对的,没有办法做我想做的事。我正在研究 DI 机制,需要获取类的构造函数。但不幸的是,构造方法 === 类定义,所以我应该找到另一种方法来做我需要的。

标签: javascript inheritance constructor


【解决方案1】:

它不是防弹的,但你可以将构造函数转换为字符串,看看它是否包含单词constructor( 或类似的东西

function hasOwnConstructor(instance) {
    var str = instance.constructor.toString();
    return /class(.*?[^\{])\{([\s\n\r\t]+)?(constructor[\s]+?\()/.test(str);
}

class thing1 { 
    method() { return this; }
}

class thing2 { 
    constructor(argument) { return this; }
}

var ins1 = new thing1();
var ins2 = new thing2();

console.log( hasOwnConstructor(ins1) ); // false
console.log( hasOwnConstructor(ins2) ); // true

仍然可能出现误报,但正则表达式使检查非常严格,因此不太可信。

【讨论】:

  • 谢谢,但我仍然需要 100% 的解决方案。
  • 这似乎是一种确定类是否包含构造函数的编程解决方案
  • @AaronEverly,是的,但这是一个弱检查。可以是一些注释代码,其中包含片段constructor( 或其他内容,任何内容...这就是为什么此解决方案不是 100% 安全的原因。
  • @AlexChandler 可能会创建一个正则表达式或函数来搜索构造函数的确切模式。检测类声明然后查找构造函数的东西。您是否正在寻找解析呈现的 HTML 的解决方案?
  • @AlexChandler - 我认为没有。没有任何方法可以告诉您构造函数是否存在,它是什么等。我认为您能做的最好的事情就是将类作为字符串获取,并尝试从中找出答案。
【解决方案2】:

检查构造函数。

class Example {

    constructor(prop1, prop2) {

    this.prop1 = prop1;
    this.prop2 = prop2;

      }
    }

您可以通过构造函数将参数传递给您的类,该构造函数建立可以在创建新实例时全局引用的属性。

这一行会将 int 1 和“test”作为值传递给 prop1 和 prop2:

const exampleVar = new Example(1, "test");

并可能呈现如下内容:

<Example prop1=1 prop2="test" />

希望这会有所帮助。如果它有构造函数,则有构造函数,如果没有构造函数,则没有构造函数。

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2019-08-09
    • 2016-08-01
    • 1970-01-01
    • 2017-06-10
    • 2016-05-11
    • 2011-04-17
    • 2017-02-09
    • 2021-03-26
    相关资源
    最近更新 更多