《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(或validIsUndefinedvalidIsEmpty),减少了资源的消耗。后者多了一个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();
posted @ 2020-06-04 23:00  千江暮雪  阅读(8)  评论(0)    收藏  举报