💾 JavaScript 对象构造器
常规的 {...}
语法允许创建一个对象。但是在需要创建很多类似的对象,例如多个用户或菜单项等。这可以使用构造函数和 "new"
操作符来实现。
# 构造函数
构造函数在技术上是常规函数。不过有两个约定:
- 命名以大写字母开头。
- 只能由
new
操作符来执行。
🌰 例子:
function User(name) {
// this = {} (隐式创建对象)
this.name = name;
this.isAdmin = false;
// return this (隐式返回对象)
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
当一个函数被使用 new
操作符执行时,它按照以下步骤:
- 一个新的空对象被创建并分配给
this
。 - 函数体执行。通常它会修改
this
,为其添加新的属性。 - 返回
this
的值。
使用构造器实现可重用的对象创建代码。任何函数(除了箭头函数,它没有自己的 this
)都可以用作构造器。即可以通过 new
来运行,它会执行上面的算法。「首字母大写」是一个共同的约定,以明确表示一个函数将被使用 new
来运行。
当无参构造时,括号可以省略,例如:
let user = new User
。但是省略括号不是一种好的代码风格,影响代码可读性。
关于
new function()
:如果有许多行用于创建单个复杂对象的代码,可以将它们封装在一个立即调用的构造函数中:let user = new function() { this.name = 'Simon' this.isAdmin = false }
1
2
3
4这个构造函数不能被再次调用,因为它不保存在任何地方,只是被创建和调用。因此,这个技巧旨在封装构建单个对象的代码,而无需将来重用。
# 构造器的 return
通常,构造器没有 return
语句,它们的任务是将所有必要的东西写入 this
,并自动转换为结果。
但是,如果这有一个 return
语句,那么规则就简单了:
如果
return
返回的是一个对象,则返回这个对象,而不是this
(会覆盖掉原来返回的this
)。🌰 例如:function BigUser() { this.name = "John"; return { name: "Godzilla" }; // <-- 返回这个对象 } alert( new BigUser().name );
1
2
3
4
5
6如果
return
返回的是一个原始类型,则忽略。例如:function SmallUser() { this.name = "John"; return; // <-- 返回 this }
1
2
3
4
提示
通常构造器中不会有 return
语句。 return
返回对象是特殊行为。
# 构造器中的方法
🌰 例子:
function User(name) {
this.name = name;
this.sayHi = function() {
alert( "My name is: " + this.name );
};
}
let simon = new User('Simon')
simon.sayHi()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 构造器总结
- 构造函数为创建对象带来灵活性。构造函数的参数,定义了如何构造对象以及要在对象放入什么。
- 构造函数只能使用
new
来调用。这样调用意味着开始创建了空this
,最后返回了填充了值的this
. - JavaScript 还为许多内建对象提供了构造函数,比如 日期
Date
、集合Set
。
编辑 (opens new window)
📢 上次更新: 2022/09/02, 10:18:16