《javascript设计模式》读书笔记--第一章 项目中函数的写法,规范,优化
1. 函数的理解
函数除了是函数本身,也是可以看做变量,还可以看作一个对象。
//简单的声明函数
function myMethod(){
}
//相当于变量
let myMethod = function(){
}
//亦是一个对象
let myMethod = new Function();
2. 项目中函数的优化和规范的必要性
如果两个人都用到了同一个函数,但是函数内容不一样,
- 假设是全局函数,那么后面的会对前面的造成覆盖,这显然不是大家想看到的结果。
- 如果不是全局的,写两遍同一个函数名的东西是否有必要,能否创建一个类方法供大家调用、继承、维护而互相不影响。
忘了在哪里看到的,也从同事那边了解到过
西方于中方,大厂于小作坊,为何有很大区别,在于前者在写代码过程中造了很多轮子(一些逐渐积累起来的,常用、便捷的工具类、组件、模块、模式、框架等等),这种规范性的东西越多,写代码越不容易出错,就算出错也容易定位问题,并且灵活、便于复用。
由此可见平时注意积累和规范的必要性。
3. 函数优化方式
下面将用三种不同形式对多个函数进行封装,循序渐进来说明怎么写最好。
以判断一个变量是否有有效数值为例:
3.0 成员函数(或成员变量) —— 不可复制,不可取
let validObject = function(){};
validObject.validIsNull = function(){
//判断是否是Null
};
validObject.validIsUndefined = function(){
//判断是否是Undefined
};
validObject.validIsEmpty = function(){
//判断是否为空
}
3.1 对象收编 —— 某些情况消耗过高,视情况而定
为避免项目中定义全局函数过多,万一其他人员也命名了类似函数,造成的函数覆盖,需要对相关函数进行包裹、封装,以对象收编。
let validObject = function(){
this.validIsNull = function(){
//判断是否是Null
},
this.validIsUndefined = function(){
//判断是否是Undefined
},
this.validIsEmpty = function(){
//判断是否为空
}
};
调用方法如下:
let myValidMethod = new validObject();
myValidMethod.validIsNull();
myValidMethod.validIsUndefined();
myValidMethod.validIsEmpty();
ps: 上面不是用validObject.validIsNull而是用this. 代替,意义在于同一个方法可以通过new来实例化,复制生成一个新的对象,新new的myValidMethod可以继承validObject类下面的三个方法。而不是只有一个validObject方法本身。
3.2 原型链
let validObject = function(){};
validObject.prototype.validIsNull = function(){
//判断是否是Null
},
validObject.prototype.validIsUndefined = function(){
//判断是否是Undefined
},
validObject.prototype.validIsEmpty = function(){
//判断是否为空
}
调用方法如下:
let myValidMethod = new validObject();
myValidMethod.validIsNull();
myValidMethod.validIsUndefined();
myValidMethod.validIsEmpty();
或者
let validObject = function(){};
validObject.prototype = {
validIsNull :function(){
//判断是否是Null
return this;
},
validIsUndefined = function(){
//判断是否是Undefined
return this;
},
validIsEmpty = function(){
//判断是否为空
return this;
}
}
调用方法如下:
let myValidMethod = new validObject();
myValidMethod.validIsNull().validIsUndefined().validIsEmpty();
ps: 同为原型链方法,共同优点在于支持复制、继承,并且最终通过原型链找到的是同一个方法validIsNull(或validIsUndefined或validIsEmpty),减少了资源的消耗。后者多了一个return this便于链式调用。
3.3 可扩展的原型方法
阅读prototype.js
//基于原型链的扩展方法
Function.prototype.addMethod = function(name,fn){
this[name] = fn;
/*弄清this的含义,
如果this.prototype[name]=fn,
后面myValidMethod调用时需要从原型链才能调用到新增的方法*/
return this;
}
//新建实例,继承原型链
let validObject = new Function();
//支持链式添加
validObject.addMethod("validIsNull",function(){
//判断是否为null
console.log("判断是否为null");
return this;
}).addMethod("validIsUndefined",function(){
//判断是否是Undefined
console.log("判断是否为undefined");
return this;
}).addMethod("validIsEmpty",function(){
//判断是否为空
console.log("判断是否为空");
return this;
})
调用方式
//支持链式调用
myValidMethod.validIsNull().validIsUndefined().validIsEmpty();

浙公网安备 33010602011771号