2017-02-28 1 views
1
function getClass(name) { 
    switch (name) { 
     case 'string': return String; 
     case 'array': return Array; 
     default: return Object; 
    } 
} 
obj = new (getClass()); 

だから誰でもこれらのコードを説明することができますが、私は新しいことを理解していますが、新しいものは何ですか?新しい(getClass())の意味は何ですか?

+0

括弧は何もしない、彼らは物事をグループ化するためです。それはプログラマーの個人的なスタイルや過度のものであるようです(switchステートメントにも不要なかっこがあります)。 – JJJ

+2

@JJJ間違っています。括弧は、パラメータなしで 'getClass'が呼び出され、' String'のように結果に対して 'new'が呼び出されるようにするために必要です。括弧がなければ、それはコンストラクタとして 'getClass'関数自体を呼び出すでしょう。 –

+0

@torazaburo、あなたはその質問に答えたいですか?これは 'obj = new getClass()();'と同様に動作し、他のスタイルよりも明白です。 –

答えて

1
obj = new (getClass()); 

これが意味:

  1. は、引数なし(getClass())とgetClass関数を呼び出します。それはString、またはArray、またはObjectのいずれかを返します。この場合は後者です。

  2. getClass()の戻り値でnewを呼び出します。その場合、これは新しいオブジェクトを作成するnew Objectに相当します。

1

あなたは起こるいただきました、より良い説明

object = new getClass()(); // object = new (getClass()); 

を使用することができます。関数getClassを呼び出し、新しいインスタンスのオブジェクトを返します。

function getClass(name) { 
 
    switch (name) { 
 
     case 'string': return String; 
 
     case 'array': return Array; 
 
     default: return Object; 
 
    } 
 
} 
 

 
var typeObject = new getClass()(), 
 
    typeArray = new getClass('array')(), 
 
    typeString = new getClass('string')(); 
 

 
[typeObject, typeArray, typeString].forEach(function (o) { 
 
    console.log(typeof o); 
 
    if (typeof o === 'object') { 
 
     console.log('hasOwnProperty' in o); 
 
     console.log('splice' in o); 
 
    } 
 
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題