在 JavaScript 中,我们创建一个对象通常使用字面量的形式来创建,例如:
const obj = {
name: 'kaijun',
age: 23,
gender: 'male'
}
当然,我们也可以用创建 Object 对象实例的方法来写:
const obj = new Object();
obj.name = 'kaijun';
obj.age = 23;
obj.gender = 'male';
但是即使是比较简洁的字面量形式,在创建多个对象时,也会有很多冗余的代码,比如:
const A = {
name: 'xiaoming',
age: 20,
gender: 'male'
}
const B = {
name: 'xiaohong',
age: 21,
gender: 'female'
}
可以看到,上面的 name、age、gender 都太多余了,于是聪明的我们就可能会封装一下:
function Person(name, age, gender) {
return {
name,
age,
gender
}
}
const A = Person('xiaoming', 20, 'male');
const B = Person('xiaohong', 21, 'female');
如果你会这样写,恭喜你已经掌握了工厂模式,这样的话代码就会优雅许多了。但是这样做有一个缺点,就是你无法知道对象的类型。
typeof A === 'Person' // false
A instanceof Person // false
这太不方便了吧,于是聪明的你可能又会想到构造函数模式:
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
const A = new Person('xiaoming', 20, 'male');
const B = new Person('xiaohong', 21, 'female');
构造函数和工厂模式很像,主要有以下两点区别:
- 方法没有 return,而是直接把参数赋值给 this 下的同名变量,这样做是因为后面 new 的时候,会把 this 指向调用 new 出来的那个实例对象,所以就完成了赋值操作;
- 调用的构造函数的时候,在构造函数前面加一个 new(如果没有加 new,就当做普通函数使用,作用于会在当前代码块的环境里面,函数里面的值会赋值给当前作用域);
通过构造函数 new 出来的对象,我们是能检测到它的类型的:
A instanceof Student // true
A instanceof Object // true
未完待续……