JS では、直接変数を使用してオブジェクトを直接作成できます。ここで説明するのは、コンストラクター (関数) を定義する場合です。以下のように
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person('lily', 20);
いくつかのライブラリコードが正規の関数を作成することがわかりました式 オブジェクト メソッドには new が必要ありませんが、これは奇妙です。以下のように
var reg = RegExp('^he$');
このテストでは、new が使用されているかどうかに関係なく、最終的に返されるオブジェクトは通常のオブジェクトであり、それらの type はすべて「object」であることがわかりました。
var reg1 = new RegExp('^he$');
var reg2 = RegExp('^he$'); // true
reg2.test('he'); // true
console.log(typeof reg1); // object
console.log(typeof reg2); // object
まあ、コードは正常に実行されます。
この場合は、新しいコードを書かないでください。これにより、コードの量も節約されます。これは他のタイプにも当てはまりますか?文字列/数値/ブール値を試してください。
var str1 = 新しい文字列(1);
var str2 = 文字列(1);
var num1 = 新しい数値('1');
var num2 = 数値('1');
var boo1 = 新しいブール値(1) );
var boo2 = Boolean(1);
console.log(typeof str1); // object
console.log(typeof num1); log(typeof num2); //number
console.log(typeof boo1); //object
console.log(typeof boo2); // 通常の状況と異なることがわかります。通常、新しいかどうかに関係なく、typeof の後に object が続きます。
ただし、文字列/数値/ブール型の場合、新しいオブジェクト typeof は「object」を返し、新しい型以外の typeof は「string」を返します。
つまり、new が適用できない場合、他の型はそれぞれ文字列、数値、ブール型に変換できます。
さて、この章の冒頭の person クラスに戻りましょう。つまり、自分で作成したクラスは new 演算子を使用せずにオブジェクトを生成できるでしょうか。
function 人(名前, 年齢) {
this.name = 名前;
this.age = 年齢;
}
var p = 人('ユリ', 20);
console.log(p); // 未定義
;
未定義を返すことは明らかに不可能です。したがって、new を使用せずに Person インスタンスを作成するのは空想的です。
それを実現しなければならない場合はどうしますか?実際、次のように動作します
function person(name, age) {
this.name = name;
this.age = age;
if (this===window) {
return new Person(name, age) ;
}
}
var p = person('lily', 20); // object
は Person クラスを少し変更しました。実際には、 Person がコンストラクタとして実行されるか、関数として実行されるかは内部的に区別されます。