在javascript中,如果我有2个字符串myApp
和my-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
,但它没有用。
答案 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!");