今天面试被问到了面向对象编程的设计模式
我在此就总结一下基于面向对象的设计模式的几个常用:
一、单例子模式
单例模式是开发中常用的模式,项目中可以用单例模式来进行模块划分,但是并不能批量的去‘生产’,属于一种手工作业的模式
e.g.:var k={a:1,b:func}
二、工厂模式是指实现同一件的的代码放入一个函数中,以后如果想去实现功能,就没有必要去重写代码(其实简单的来说就是函数的封装,jquery就是用这种方式来封装的)
他的优点,“低耦合高内聚”:何为‘低耦合高内聚’?说白了就是减少代码的冗余,提高代码的可利用率
三、构造函数模式,为了创建一个自定义类和这个类的实例
其实它和工厂模式很像,他们的区别在于执行时;
e.g.、var f=new FN(). f就是整个函数的返回值,所有的类都是函数数据类型,new-类它本身就是一个普通的函数,所有的实例(f)都是数据类型
它和工厂模式也有共同点:他们都形成了私有的作用域,然后形参赋值-预解释-代码由上到下执行
不同点:在代码执行前不用手动去创建对象,constrctor:f。。。。。。浏览器会默认创建一个对象数据类型的值(这个对象就是当前的实例f)然后代码由上至下执行,以当前实例为执行的主体。最后默认返回实例。
检测实例 我们用的是intanceof。。。。为什么不用typeof呢? 因为typeof具有局限性,不能区分object下的对象,数组以及正则。私有属性检测hasownproperty
四、原型链模式:这是一种基于构造函数模式、原型链方法解决了,方法或属性公有的问题、将实例化中的相同属性和方法提取出来,成为公有属性和方法(这里存在兼容性问题不能使用—proto—)
1)每一个函数数据类型,都具备一个天生自带的属性(prototype)并且这个属性是一个对象数据类型的值
2)在prototype上浏览器天生添加了一个属性constructor(构造函数)属性值是当前函数本身
3)每个对象数据类型都自带一个__proto__(ie犯贱不支持这个属性,但是原理是这样的)属性值是当前所属类的原型