JavaScript 中的对象构造器是一种函数,用于创建类的实例,通常称之为对象。构造器在你使用 new
关键字声明对象时被调用。构造器的目的在于创建对象并设置其属性值(如果有的话)。
有两种方式可以在 JavaScript 中创建对象模板——使用类和使用对象构造器。
每当需要使用相同的语法创建多个对象时,就需要一个对象模板。例如,你在管理汽车库存。每次使用对象字面量创建新对象不是一个好主意。在这种情况下,就需要使用对象构造器。
对象构造器的主要优点是可以重用代码。
语法
你可以遵循以下语法使用对象构造器来创建对象:
function Funcname(p1, p2, ..., pN) {
this.prop1 = p1;
}
const obj = new Funcname(args);
在上述语法中,Funcname()
是一个构造器函数,你可以用任何有效的标识符替换 Funcname
。
p1
, p2
, …, pN
是你可以在函数体内使用的参数。在创建对象时需要传递参数给构造器。
this
关键字表示你正在使用的函数上下文。在这里,this
关键字指的是当前对象的实例。
要创建一个对象,可以使用带有 new
关键字的函数构造器。
示例:使用构造器函数创建对象
在下面的例子中,我们创建了一个 Tree()
函数。在函数体中,我们初始化了 name
和 age
属性。
之后,我们使用带有 new
关键字的函数名创建了 Tree()
构造器的对象。
<html>
<body>
<p id="output"> </p>
<script>
function Tree() {
this.name = "palm";
this.age = 5;
}
const tree1 = new Tree();
document.getElementById("output").innerHTML =
"name = " + tree1.name + ", age = " + tree1.age;
</script>
</body>
</html>
输出:
name = palm, age = 5
示例:带参数的构造器函数
在下面的例子中,Bike()
函数接收三个参数。在函数体中,我们使用这些参数初始化属性。
之后,我们使用 Bike()
构造器创建了 bike1
和 bike2
对象,并赋予了不同的值。在输出中,你可以看到对象属性的值。
<html>
<body>
<p id="output1">The bike1 object is : </p>
<p id="output2">The bike2 object is : </p>
<script>
function Bike(name, speed, gear) {
this.name = name;
this.speed = speed;
this.gear = gear;
}
const bike1 = new Bike("Honda", 100, 4);
const bike2 = new Bike("Yamaha", 200, 6);
document.getElementById("output1").innerHTML += JSON.stringify(bike1);
document.getElementById("output2").innerHTML += JSON.stringify(bike2);
</script>
</body>
</html>
输出:
The bike1 object is : {"name":"Honda","speed":100,"gear":4}
The bike2 object is : {"name":"Yamaha","speed":200,"gear":6}
通过这种方式,你可以使用对象构造器重用对象语法代码,并创建相同类型的多个对象。
向构造器添加属性或方法
在《对象》章节中,你学习了如何使用点符号或方括号符号向对象添加属性或方法。但如果想向对象构造器添加属性或方法呢?
对象构造器不允许你在定义之后添加属性或方法。所以,你需要在定义构造器时添加所需的属性和方法。让我们通过下面的例子来理解这一点。
示例
下面的例子演示了如何在对象构造器中添加方法和属性。我们在 HouseAddress()
构造函数中添加了三个属性和 getFullAddress()
方法。
同时,我们也通过对象引用执行了这个方法。
<html>
<body>
<p id="output1">The house object is </p>
<p id="output2">The full address of the house is </p>
<script>
function HouseAddress(no, street, city) {
this.houseNo = no;
this.street = street;
this.city = city;
this.getFullAddress = function () {
return this.houseNo + ", " + this.street + ", " + this.city;
};
}
const house = new HouseAddress(20, "Cooper Square", "New York");
document.getElementById("output1").innerHTML += JSON.stringify(house);
document.getElementById("output2").innerHTML += house.getFullAddress();
</script>
</body>
</html>
输出:
The house object is {"houseNo":20,"street":"Cooper Square","city":"New York"}
The full address of the house is 20, Cooper Square, New York
如果你像下面这样添加方法或属性。它只会添加到特定的对象而不是构造函数。
Obj.prop = 20;
使用对象构造器创建的其他对象不会包含 prop
属性,因为它只添加到了 obj
对象上。
JavaScript 中的对象原型
在 JavaScript 中,每个对象默认都含有一个原型属性,并且对象构造器也是一种对象。因此,你可以向对象原型添加属性或方法。
语法
你可以遵循以下语法向对象构造器原型添加属性或方法:
obj.prototype.name = value;
在上述语法中,obj
是你需要添加属性或方法的对象构造器。
name
是属性或方法的名称。
对于属性,你可以将 value
替换为实际值;对于方法,你可以将 value
替换为函数表达式。
示例
在下面的例子中,我们在 Bike()
构造器的原型中添加了 BikeDetails()
方法。
BikeDetails()
方法可以通过任何 Bike()
构造器的对象来执行。但是,当你打印 bike1
和 bike2
对象时,不会显示 BikeDetails()
方法,因为它是添加到原型中的。
<html>
<body>
<p id="output1">The bike1 details is: </p>
<p id="output2">The bike2 details is: </p>
<script>
function Bike(name, speed, gear) {
this.name = name;
this.speed = speed;
this.gear = gear;
}
Bike.prototype.BikeDetails = function () {
return this.name + ", " + this.speed + ", " + this.gear + "<br>";
};
const bike1 = new Bike("Honda", 100, 4);
const bike2 = new Bike("Yamaha", 200, 6);
document.getElementById("output1").innerHTML += bike1.BikeDetails();
document.getElementById("output2").innerHTML += bike2.BikeDetails();
</script>
</body>
</html>
输出:
The bike1 details is: Honda, 100, 4
The bike2 details is: Yamaha, 200, 6
JavaScript 中的内置对象构造器
JavaScript 包含了内置构造器,如下表所示:
序号 |
构造器 |
描述 |
示例 |
1 |
Array |
创建数组 |
new Array() |
2 |
String |
创建字符串 |
new String("Hello") |
3 |
Number |
创建数字 |
new Number(92) |
4 |
Boolean |
创建布尔值 |
new Boolean(true) |
5 |
Set |
创建一个新的 Set |
new Set() |
6 |
Map |
创建一个新的 Map |
new Map() |
7 |
Object |
创建一个新的对象 |
new Object() |
8 |
Function |
创建一个新的函数 |
new Function("x", "return x * x;") |
9 |
Date |
创建 Date 对象的实例 |
new Date() |
10 |
RegExp |
创建一个新的正则表达式 |
new RegExp("\\d+") |
11 |
Error |
创建一个新的错误 |
new Error("new error.") |
12 |
Symbol |
创建一个符号 |
Symbol("description") |
然而,你也可以使用字面量表达式来定义包含原始值的数字、字符串、布尔值等变量。