2017-08-10 3 views
-1

JavaScriptでMyClass.constructor.nameによってクラス名を取得する方法はわかりましたが、私の質問はクラス名が常に「Object」を名前JavaScriptまたはTypescriptでは、項目名のキャスト後にクラス名は常に「Object」を返します

1. MyClass.name // return MyClass 
2. var myInstance = myClass.constructor.name; // return MyClass 
3. var myCast = <MyClass> item; // item is an object with same properties of MyClass 
4. var castName = myCast.constructor.name // return Object 

私が4行目で述べたように、私は「オブジェクト」としてmyClassの名前を取得しています。なぜですか?

+0

これは行4の有効なJavascriptまたはTypescriptではありません – Joe

+0

はい、私はそれを修正します –

+1

キャストはコンパイル時のみです。実行時には基本的に 'var myCast = item'ですが、' item'は単なるコンストラクタ名が 'Object'であることは意味があります –

答えて

0

次のようにこれまでのところ、私はこの問題のためにテストしたことを、@jcalzの解決策があった:

var newItem = Object.assign(new MyClass(), item); 
newItem.name; // return MyClass without values 

しかし、このソリューションは名前としてMyClassを返しますが、その値はリセットされます。それは私のために働くように従うよう 最後にI'haveは、このソリューションのビットを変更:

var newItem = Object.assign(MyClass, item); //without new keyword 
newItem.name; // return MyClass with all values. 

は、あなたの答えのために、みんな、ありがとうございました。

1

鋳造変更またはオブジェクトのコンストラクタ(またはプロトタイプ)を置き換えるものではありません おかげで、それが唯一のオブジェクトは、コンパイラがそうでないことを証明できなかった契約を満たしている知っているあなたにユーザーを型システムに通知します。

変数をキャストして基礎となるオブジェクトを変更すると、多くの問題が発生します。最も鮮明なのは、凍ったオブジェクトをそのように変更することはできず、キャストすることは簡単ではありません。

class MyClass { } 

var myInstance = (new MyClass()).constructor.name; 
var myCast = <MyClass> (new MyClass()); 
var castName = myCast.constructor.name 

console.log(myInstance, castName); // prints MyClass, MyClass 

あなたは常にオブジェクトリテラルのObjectを返す.constructorプロパティに、アクセスしています。それは活字体に固有ではありません。

console.log(({}).constructor);

+0

ありがとう、元の名前はどうやって入手できますか?あなたはどんな方法ですか? –

+0

元の名前は何ですか? 'item'がオブジェクトリテラルであれば、それはありません。 'MyClass.name'でクラスを含む*関数の*名前をいつでも得ることができますが、それはあなたが得ることができるほど近くにあります(インタフェースには適用されません)。 – ssube

+0

実際、アイテムは、私がAngular Ionicプロジェクトで使用しているMyClassの配列の要素なので、関数を削除関数のような関数のパラメータとして使用します。この関数では、MyClassの名前を項目。しかしそれは不可能です。 –

関連する問題