有关Js的单例模式、工厂模式、构造函数模式

一 单例模式:

1、什么叫做单例模式?

单例模式就是分组编写代码的模式,就是把描述同一个事物或者对象的属性和方法放在一个内存空间下,那么不同事物和属性之间即使是属性名一样也不会发生冲突。

而我们知道,对象数据类型的作用是就是把描述同一个事物或者对象的属性和方法放在一个内存空间下,使得不同事物和属性之间即使是属性名一样也不会发生冲突。

有关Js的单例模式、工厂模式、构造函数模式   ------------->有关Js的单例模式、工厂模式、构造函数模式

平时我们会叫person1和person2叫做对象,但是在单例模式中,person1和person2叫做命名空间(命名空间就是给开辟出来的空间起个名字)。

2、单例模式的作用?

单例模式就是起到分组的作用,比如说一个大型项目的开发,需要很多开发人员一起进行,这时候可以把项目分成几个功能模块,不同的人编写不同的模块,最后把所有模块的代码合并起来,这就叫做模块化开发,而单例模式常常用于项目开发中,因为其可以进行模块化开发。

3、单例模式注意点:

当在一个命名空间A中调用别的命名空间B中的函数的时候,调用方法为 B.functionName();

当在一个命名空间A中调用自己空间中的函数的时候,调用方法为 this.functionName();

4、单例模式开发弊端:

单例模式虽然解决了分组作用,但是不能解决批量生成问题,属于手工模式。


二、工厂模式:

1、什么是工厂模式?

把实现同一件事情的相同代码放到同一个函数中,想实现这个功能只要执行这个函数即可,这就是工厂模式,也叫做“函数的封装",这也是”低耦合,高内聚“,从而达到减少页面冗余代码,提高代码重复利用率的作用。

有关Js的单例模式、工厂模式、构造函数模式有关Js的单例模式、工厂模式、构造函数模式

工厂模式的弊端?

工厂模式没有解决对象识别的问题。(就是怎么知道对象是什么类型的问题),工厂模式无论怎么调用都是Object 对象

有关Js的单例模式、工厂模式、构造函数模式

只要告诉name和age,然后调用函数person就可以对象,可以实现批量生产。

说到js的函数封装,我们这里额外拓展一下一些有关Js的知识:

1、Js是一种轻量级的”编程语言,而html、css这些不属于编程语言,它们知识一个标记语言。编程语言都是面向对象开发的,所以Js也是一种面向对象的开发语言,而面向对象开发的都是与类的继承、封装和多态有关系。

刚刚已经说过了封装,就是把一件事的相同代码放到一个函数中,那么什么是继承和多态?

继承:就是子类继承父类的属性和方法。

多态:当前方法的多种形态,在后台语言中(.net、Java、c#、c++等),多态包括重载和重写。重载就是函数方法名相同,参数不同,重写就是子类重写父类中的方法。

2、Js中存在多态,但是Js中不存在函数的重载,因为函数名相同的话,后面的一定会把前面的覆盖,但Js中存在重写,所以Js中的多态主要是指重写。但是也存在一种既不是重写却类似重载的Js多态方式,就是我们调用函数时根据传入不同的参数实现不同的功能,如下:

有关Js的单例模式、工厂模式、构造函数模式  有关Js的单例模式、工厂模式、构造函数模式


当传入空参数的时候,num为undefined所以会返回0,如果不是空参数的时候,就返回num。


三:构造函数模式:

有关Js的单例模式、工厂模式、构造函数模式有关Js的单例模式、工厂模式、构造函数模式

都知道Array、Object、Function等这些都是内置类,所有的数组都是内置类Array的实例,所以的对象都是内置类Object的实例,所以函数都是Function的实例。

1、构造函数模式的目的:是为了穿件一个自定义类,并且创建这个类的实例。

2、构造函数模式和工厂模式区别:

2.1、执行的时候,普通函数的执行:fn(),构造函数的执行:new Fn();(通过new操作后,fn就变成了一个类了,而不是一个函数,所以这里最后首字母大写。)

在js中所有的类都是函数数据类型的,它通过new执行,变成了一个类,但是这个类的本身还是一个函数。js中所有累的实例都是对象类型的。

2.2、在函数代码执行的时候:

相同点:都是形成一个私有作用域,然后给形参赋值-->私有作用域的预解释-->代码从上到下执行。

不同点:函数构造模式,在代码执行之前,不用自己动手创建对象,浏览会默认创建一个对象数据类型值,这个对象就是当前类的一个实例,接下来代码从上到下执行,以当前类的实例为执行主体(this代表当前类实例),然后分别把属性和属性值赋值给当前类实例this.xxx=xxx,最后浏览器会默认把创建的实例返回。

在构造函数模式中,类中(函数体中)出现的this,this.xxx=xxx是当前类的实例。

p1 ,p2都是类person的实例,所以都拥有study的方法,但是不同实例之间的方法是不一样的,p1.study === p2.study 会返回false,因为在类的实例中增加的属性相当于当前实例的私有属性,实例之间是一个单独的个体,所以所有的属性之间是不相等的。

3、构造函数模式扩展:

3.1 如果类Fn,当new一个Fn的时候,如果没有传入参数,小括号可以省略。

       var f = new Fn()   =====>var f = new Fn;

3.2 this问题:在类中出现的this,this.xxx= xxx中的this是指当前类的实例,而一个属性值(方法)方法中的this需要看方法执行时前是否有”.“才能知道this指的是谁。

     有关Js的单例模式、工厂模式、构造函数模式有关Js的单例模式、工厂模式、构造函数模式

第一个输出的是f1的num,而第二个输出的是window下的num,说明在第一个中,函数getX中的this代表p1,而第二个代表window。

3.3 类也有着普通函数的一面,当函数被执行的时候,var num 其实只是当前形成的私有作用域中的私有变量而已,它和我们当前类的实例没有关系,只有this.xxx = xxx 的才相当于给当前类实例增加私有属性和方法,才与当前类实例有关系。

3.4 浏览器在构造函数模式中会默认地把我们的实例返回(返回的是一个对象数据类型值),如果我们自己手动返回一个基本数据类型值,那么当前类的实例不变,返回的还是当前类的实例,但是当我们手动返回一个对象数据类型值的时候,如return {name:"利好"},那么这个手动返回的对象数据值就会覆盖当前类的实例,返回我们手动返回的值。

3.5 检查某一个实例是否属于这个类的方法:instanceof

    f1 instanceof Fn   ===>//如果是返回true,不是返回false

   f1 instanceof Array

3.6 f1 和f2 都是Fn的实例,都有各自的私有属性,互相独立,互不干系。

检查某个属性是否属于这个对象的方法:in

"getX" in f1;====>//如果是返回true,不是返回false

(in是不管属性是私有的还是不是私有的,只有对象存在这个属性,就返回ture,构造返回false)

检查某个属性是否为这个对象的私有属性的方法:hasOwnProperty只检查私有属性)

f1.hasOwnProperty("getX");//是返回true,不是返回false

3.7 isPrototypeOf()方法测试一个对象是否存在另一个对象的原型链上

//object1是不是Object2的原型,也就是说Object2是Object1的原型,,是则返回true,否则false

object1.isPrototypeOf(Object2);