在我的印象中,js 函数貌似这样
function fun(){
// todo:
}
或者这样
const fun = function(){
// todo:
}
一种是函数式,一种是变量声明式,若一场景,是做一个表单校验功能,你可能会写
const checkName = function(){
// todo:
}
const checkPwd = function(){
// todo:
}
const checkEmail = function(){
// todo:
}
...
这样写,当然,功能是实现了,但是这样不外乎会在内存中多开辟了不必要的空间,我们实际上可以这样来写
const checForm = {
checkName(){
// todo:
},
checkPwd(){
// todo:
},
checkEmail(){
// todo:
},
...
}
这样,我们使用一个对象来存储校验的一些方法,使用 checkForm.checkName() 就行,可以作为一个通用的方法(公共方法),不单单是登录,任何需要用到校验的地方都可以引入使用,但是又有问题,若当前不满足时,动态的添加一个 checkForm.checkPhone = function () { // todo: } 这样会影响到全局,因为是同一个对象来的 下面这种方式也同样会面临这种问题
const checkForm = function(){
this.checkName = () => {
// todo:
}
this.checkEmail = () => {
// todo:
}
...
}
但是我们可以这样来写:
cosnt checkForm = function(){}
checkForm.prototype = {
checkName(){
// todo:
},
checkEmail(){
// todo:
},
...
}
这种方式就避免了上述情况,可以这样使用
const checkA = new checkForm()
checkA.checkName()
checkA.checkPhone = function() {
// todo:
}
const checkB = new checkForm()
checkB.checkName
// 此处的 checkA 与 checkB 是不影响的,这样就避免了数据污染,有更好的扩展性
有人不知道 Function.xxx 与 Function.prototype.xx 的区别,实际上 prototype 是对象原型上的,不论你通过 new 实例化多少次,prototype 是不变的, Function.xx 这种方式挂载的函数或变量属于静态私有变量,通过 new 实例化是访问不到的 只能通过 Function.xx 的方式访问♀️