Heim >Web-Frontend >js-Tutorial >So verwenden Sie den Konstruktor, um Objekte in JavaScript ohne neue zu erstellen
Beim Erstellen von Objekten in JS können direkte Mengen direkt verwendet werden. Hier wird die Definition eines Konstruktors (einer Funktion) besprochen. Wie folgt
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person('lily', 20) ;
Es ist seltsam, dass einige Bibliothekscodes reguläre Objekte ohne neue erstellen. Wie folgt:
var reg = RegExp('^he$');
Der Test ergab, dass die endgültig zurückgegebenen Objekte unabhängig davon, ob new verwendet wird oder nicht, reguläre Objekte sind und der Typ von ihnen alle „Objekt“ ist. .
var reg1 = new RegExp('^he$');
var reg2 = RegExp('^he$');
reg1.test('he'); // true
reg2 .test('he'); // true
console.log(typeof reg1); // object
console.log(typeof reg2); // object
Hmm, ziemlich gut, Der Code läuft einwandfrei.
Wenn dies der Fall ist, schreiben Sie einfach überhaupt nichts Neues, um die Menge an Code zu sparen. Gilt das auch für andere Typen? Versuchen Sie es mit String/Zahl/Boolean.
var str1 = new String(1);
var str2 = String(1);
var num1 = new Number('1');
var num2 = Number('1');
var boo1 = new Boolean(1);
var boo2 = Boolean(1);
console.log(typeof str1); // object
console.log(typeof str2); string
console.log(typeof num1); // object
console.log(typeof num2); // number
console.log(typeof boo1); // object
console.log( typeof boo2); // boolean
Sie können sehen, dass es sich vom regulären Fall unterscheidet. Unabhängig davon, ob es neu ist oder nicht, folgt auf „typeof“ regelmäßig ein Objekt.
Aber für die Typen String/Number/Boolean gibt der neue Objekttyp „object“ und der nicht neue Typ „string“ zurück.
Das heißt, wenn new nicht anwendbar ist, können andere Typen in Zeichenfolgen-, Zahlen- und boolesche Typen konvertiert werden.
Okay, kehren wir zur Person-Klasse am Anfang des Kapitels zurück. Das heißt, können die Klassen, die wir selbst schreiben, Objekte generieren, ohne den neuen Operator zu verwenden?
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = Person('lily', 20);
console.log(p); // undefiniert
gibt undefiniert zurück, was offensichtlich nicht möglich ist. Daher ist es fantasievoll, eine Person-Instanz zu erstellen, ohne new zu verwenden.
Was ist, wenn es realisiert werden muss? Tatsächlich funktioniert es wie folgt
function Person(name, age) {
this.name = name;
this.age = age;
if (this===window) {
return new Person(name, age);
}
}
var p = Person('lily', 20); // object
hat die Person-Klasse leicht verändert. Tatsächlich wird intern unterschieden, ob Person als Konstruktor oder als Funktion ausgeführt wird.