2017-09-14 6 views
1

オブジェクトのクラスの名前を取得するにはどうすればよいですか?私はこの例で "プロセス"を意味しますenter image description hereオブジェクトのコンストラクタ名を取得

私はそれを得る2つの方法を参照してください。まず一つは

getClassName(){return "Process"} 

のように、このクラスのゲッターを書くことです。しかし、私は、このクラスに属していないなどの方法を持っていないオブジェクトでこのメソッドを呼び出すようにしようとした場合、それはエラーになりますと仮定しますこの。

もう1つはobject instanceof Processです。しかし、それをより良く、より正確にする方法がありますか?

+1

これは何のために必要ですか?アプリケーションに実際の目的があるはずであれば、明示的な 'getClassName'メソッドがあります。 – Bergi

+0

可能な複製[オブジェクトのクラスとモジュールをecmascript-harmonyで見つけることができるようになる](https://stackoverflow.com/q/19279232/1048572) – Bergi

答えて

3

あなたはconstructornameからそれを得ることができます。

console.log(object.constructor.name); 

デフォルトでは、constructorは、オブジェクトを作成するために使用するコンストラクタ関数です。オブジェクトのプロトタイプから継承しています。 nameはその名前です。

あなたはそのプロトタイプに1をシャドーイング、インスタンス自体でconstructorプロパティーである可能性があるについて少し被害妄想になりたい場合は、あなたが使用できます。

console.log(Object.getPrototypeOf(object).constructor.name); 

ライブ例:

class Class1 { 
 
} 
 
const c1 = new Class1(); 
 
console.log(c1.constructor.name); // "Class1" 
 

 
class Class2 { 
 
    constructor() { 
 
    this.constructor = "I'm special"; 
 
    } 
 
} 
 
const c2 = new Class2(); 
 
console.log(Object.getPrototypeOf(c2).constructor.name); // "Class2"

しかし、JavaScriptを指定TC39委員会は幸せな電子だったことに注意してくださいnough新しい約束そのthencatchリターンを構築するときに、あなたもあれば、あなた自身に出ないだろうので、(hereを行くと、インスタンスからconstructorを読み込むステップを参照)Promise秒でインスタンスのconstructorプロパティを使用しますそれを使用しました。彼らはインスタンスのプロトタイプには行きません。

しかし、それは道に迷ってあなたを導くためにするために、プロトタイプのconstructorプロパティもでマックすることができますので、はい、ちょうど完全を期すため、あなたはそれのためのプロトタイプに行く場合でも、それは、まだ可能です:

class Example { 
 
} 
 
Example.prototype.constructor = Object; // Why would anyone do this? People are weird. 
 
const e = new Example(); 
 
console.log(Object.getPrototypeOf(e).constructor.name); // "Object"

class Example { 
 
} 
 
// Why would someone do this? People are weird. 
 
Object.defineProperty(Example, "name", { 
 
    value: "flibberdeegibbit" 
 
}); 
 
const e = new Example(); 
 
console.log(Object.getPrototypeOf(e).constructor.name); // "flibberdeegibbit"

これは、関数にnameを再定義することも可能です

だから...注意してください。 (class構文のように)機能nameプロパティは、ES2015のように、新しいあること


注意。蒸散器でclassの構文を使用している場合は、nameが正しく設定されている場合とされていない場合があります。

+1

"*あなたは少しのパラノイドになりたい場合* ...あなたは '.constructor'または' .name'プロパティを使用しません:-) – Bergi

+0

@Bergi:Meh、ある程度のパラノイアがあります。 :-) –

+0

@ T.J.Crowderありがとうございます! – RoGGeR

2

.constructor.nameをオブジェクトに使用します。各オブジェクトのコンストラクタは、デフォルトで彼の作成関数を参照しています。これはnameプロパティを持ちます。関数の名前を返します。

class SomeClass { 
 

 
} 
 

 
const obj = new SomeClass(); 
 

 
console.log(obj.constructor.name);

0

次のようにnameプロパティを使用します。

class Process {} 
 

 
console.log(Process.name); 
 

 
const process = new Process; 
 

 
console.log(process.constructor.name);

をこれは、それが機能を使用して、通常の原型の継承のために働くのと同じ方法です。 objectは、このクラス/機能に由来することを確実に知られていた場合に一般的に

1

object instanceof Processが望ましいです。これがそうでない状況があるかもしれません。 Processの外観は、iframe、複数のパッケージのバージョンなどで発生する可能性があります。

通常の関数クラスのコンストラクタには既に存在するname propertyがあります。よく知られている落とし穴は、コードが縮小されているので、ブラウザJSでは一般的に役に立たず、その使用は反パターンと見なすことができるということです。一部のブラウザではnameを再割り当てできないため、クラスを識別するために別のプロパティが必要です。

適切な方法は、この問題

を避けるためです。しかし、私は、このクラスに属していないなどの方法を持っていないオブジェクトでこのメソッドを呼び出すようにしようとした場合、それはエラーになりますと仮定この。

class Process { 
    get className() { return 'Process'; } 
    ... 
} 

またはプロパティ:

はゲッターを使用することで、結果として

class Process { 
    ... 
} 
Process.prototype.className = 'Process'; 

を、ProcessclassName識別子を持っているいくつかのProcessのクラスがあるかもしれません。これは望ましくないかもしれない。 instanceofはクラスインスタンスを1つの特定のクラスに関連付けます。

関連する問題