工厂函数
- 问题:想要批量的创建很多个对象,大量的会导致代码冗余,维护不方便
- 实现:
let p1 = {
name:'小明',
age:30
}
let p2 = {
name:'小李',
age:30
}
- 解决:
- 封装函数:
function createPerson(name,age){
let p={}
p.name = name
p.age = age
return p
}
let p1 = createPerson('小明',30)
let p2 = createPerson('小李',30)
这个函数就叫工厂函数,函数代表的是数据类型、工厂代表作用。工厂函数还是一个函数,前缀代表该函数的功能作用,顾名思义,工厂函数就是一个批量创建对象的函数
但是这种写法很少见,因为有另一种函数能同样实现且代码更少
构造函数
作用与工厂函数一致,代码量更少。
使用new来调用的函数,只有通过new来调用的函数,才是构造函数,才能简写
function CreatePerson(name, age) {
this.name = name
this.age = age
}
let p1 = new CreatePerson('小明', 30)
let p2 = new CreatePerson('小张', 20)
console.log(p1, p2)
new关键字的作用:
- 创建空对象{}
- this指向这个空对象 this={}
- 给对象赋值
- 返回这个对象 return this
所以,不加new不是构造函数,返回undefined
验证构造函数:
function fn(){
}
let res1=fn() //普通函数
let res2=new fn() //构造函数
console.log(res1,res2 ) //undefined {}
在Haskell语言中,构造函数甚至被限制为首字母必须大写。由于构造函数(类型和值)在语言中非常重要,这种对大写标识符的简单限制使人们更容易看到一段代码中发生了什么。在某种程度上,大写字母弥补了语言中其他语法噪音的不足,有助于读者阅读。
所以在js中,最好也遵守这个约定,同时,在使用的时候,也提醒我们,不要忘记在前面加上new关键字
可以去菜鸟教程中看到,所有的内置对象,首字母都是大写的
补充
在构造函数中主动return,如果是值类型,则依然返回this。主动返回引用类型,如{name:'小明'}
或[1,2,3]
,会覆盖new的返回。所以,如果不想挨骂,不要这么写,不排除有的面试考验你,可能会考