2017-08-06 7 views
0

、私は2列myAppmy-appを持っているとmyAppが本当にHTMLElementを拡張するクラスの名前で、my-appは、そのクラスのタグ名であると言われた、どのように私はそれを確認するためにJavaScriptを使用できるかどうか(クラスがあると仮定して既に定義されている)?javascriptに名前の文字列がある場合、クラスにアクセスするには? JavaScriptでは

これは本当にすでに

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

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

それは、このようなPolymer.Elementとして、他の何かを延長することができることは可能ですけれども、基本的に、それは(myAppはクラスであり、HTMLElementを拡張しないことを確認する必要が定義されていた場合は基本的にテストに合格しなければなりません、そして病棟では、最終的には、それは延長する必要がありますHTMLElement)。

次に、my-appがそのクラスのタグ名であることを確認する必要があります。

これはどのようにjavascriptで行うことができますか?

eval("myApp")を試しましたが、動作しませんでした。

+0

、 'myApp.prototype instanceofはHTMLElement'ので、て、myAppはその祖先 –

+0

でのHTMLElementを持っている場合、私はPolymer.ElementはのHTMLElementを拡張する場合は100%わからないtrueを返します私はおそらく 'myApp.prototype instanceof HTMLElement || myApp.prototype instanceofPolymer.Element'となる。しかし、他の部分は私は手がかりがありません。 – omega

+0

'Polymer.Element instanceof HTMLElement'を試しましたが、それは明らかにfalseでした。 – omega

答えて

4

を行うことができ、それを考え出しました。最初の部分のための

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

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

1

classclassSyntaxErrorを投げたりconsole.assert()を使用すべきconstを使用してmyAppを宣言しようとすることで宣言されていると、チェックは、同じスコープ内で実行されるべき存在とextendsHTMLElementかどうかをチェックします。

最初の部分が確認されたら、要素を作成し、.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_}`)]);

+0

ここでの問題は、クラス名 'myApp'への参照がないことです。文字列 "myApp"と "my-app"だけです。 – omega

+0

@omegaこれは「問題」ではありません。あなたが弦を持っていなければ問題になるでしょう。推定値の 'class'識別子を識別子として文字列として' console.assert() 'に渡し、' Boolean'評価を取得し、その文字列を 'class 'の文字列表現を得るための第2引数として識別子として渡します。 – guest271314

+0

わかりません私はあなたに例を示すことができますか?上記のコードでは、変数 "myApp"と "my-app"ではなく、変数名を使用しています。 – omega

1

[OK]を私は、私はちょうどあなたは、そのタグ名からカスタム要素のクラスを取得するためにcustomElements.get()を使用することができます

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!"); 
+0

あなたの回答が解決された場合あなた自身の回答を受け入れることができますhttps://stackoverflow.com/help/self-answer – guest271314

+0

あなたの関数のバージョンはおそらく良いでしょう。私は代わりにあなたを受け入れます。 – omega

+2

Chromeでカスタム要素を実装しましたが、コードに問題があると思います。 IIRCのタグ名はASCIIで小文字ですが、toLowerCaseを使用して、非ASCIIを小文字にしていると思います。 customElements.getは簡単で直接使用できます。 –

関連する問題