如果你在javascript中有一个名字的字符串,如何访问一个类?

时间:2017-08-06 23:00:16

标签: javascript string class web-component custom-element

在javascript中,如果我有2个字符串myAppmy-app,并且被告知myApp实际上是扩展HTMLElement的类的名称,{{1是该类的标记名,我如何使用JavaScript来验证(假设已经定义了类)?

如果真的已经定义了

,基本上测试应该通过
my-app

基本上,它需要检查class myApp extends HTMLElement { constructor() { super(); } } customElements.define('my-app', myApp); 是否是一个类并且确实扩展myApp(尽管它可能会扩展其他内容,例如HTMLElement,并且在病房中,但最终,它必须扩展Polymer.Element)。

然后,必须检查HTMLElement是该类的标记名称。

如何在javascript中完成?

我试过了my-app,但它没有用。

3 个答案:

答案 0 :(得分:4)

您可以使用customElements.get()从其标记名称中获取自定义元素类。



class myApp extends HTMLElement {
  constructor() {
    super()
  }
}
customElements.define( 'my-app', myApp )

console.log( customElements.get( 'my-app' ) === myApp )  //true




答案 1 :(得分:1)

要检查class是否存在以及extends HTMLElement检查是否应在声明class的同一范围内执行,方法是尝试声明myApp使用const使用SyntaxError或使用console.assert()

验证第一部分后,您可以创建元素并检查所创建元素的.is属性或.tagName



class myApp extends HTMLElement {
    constructor() {
        super();
    }
}

customElements.define('my-app', myApp); 

// string
let str = "myApp";
// get the object, if the object exists
const myApp_ = new Function(`return ${str}`)();
// check if `myApp` exists
console.assert(myApp_ === void 0
, myApp_
, [`${myApp_} is defined`
  , new RegExp(`${str} extends HTMLElement`).test(`${myApp_}`)]);




答案 2 :(得分:1)

好的,我明白了,我可以做到

    var worked = false;
    var claimedClassName = 'myApp';
    var claimedElementName = 'my-app'; 

    try {
        const r = new Function(`return ${claimedClassName}`)();
        if (!(r.prototype instanceof HTMLElement)) {
            throw new Error('Class is not instance of HTMLElement');
        }
        var a = new r();
        if (a.tagName.toLowerCase() != claimedElementName.toLowerCase()) {
            throw new Error('Tagname does not match');
        }
        worked = true;
    } catch (err) {
        alert(err.message + "\n" + err.stack);
    }

    if (worked) alert("pass!")
    else alert("fail!");