JavaScript 面向对象之工厂模式与构造函数详解

news/2024/7/19 14:25:45 标签: js, 面向对象编程, javascript

面向对象

什么是面向对象?

所谓的面向对象,是一种编程思想,编程思路,代码的书写格式。

之前为了简化代码,我们是将程序封装为函数的形式来调用
函数会有一些小问题::
函数内部定义的局部作用域变量,函数外部无法直接调用
函数调用使用时,会占用大量的系统内存,容易造成数据溢出数据泄露,容易被黑客攻击
函数一般只是封装一些模块化的功能

复杂程序的封装会 封装成其他形式,使用面向对象的方式来封装程序。

面向对象的基本思想

基本思路就是,创建一个对象,给这个对象,添加上属性和属性值,还有函数等方法
之后通过操作这个对象,来完成需要的效果

实例
javascript">// 先通过一个函数的方法,来创建对象

function createObj(){
    // 创建对象
    const obj = {};

    // 给对象添加属性和属性值
    obj.name = '张三';
    obj.age = 18;
    obj.addr = '北京';
    obj.sex = '男';

    // 给对象添加方法
    obj.funNameAge = function(){
        console.log(this.name , this.age);
    };
    obj.funNameAddr = function(){
        console.log(this.name , this.addr);
    };
    obj.funSexAge = function(){
        console.log(this.sex , this.age);
    };
    obj.funAll = function(){
        console.log(this.name, this.sex , this.age, this.addr);
    };

    // 返回这个创建好的对象
    return obj;
}

// 调用函数,函数创建对象,并且作为返回值
// 变量中存储的就是函数创建的对象
const obj = createObj();

// 可以通过调用obj中存储的对方的方法,来实现功能
obj.funAll();

工厂模式

所谓的工厂模式,是一种书写函数的语法形式,语法规范
就向工厂中的流水线一样,按照步骤来执行需要的操作。

规则

步骤1:创建对象
步骤2:给对象定义属性和属性值
步骤3:给对象添加方法
步骤4:定义对象为返回值

实例

javascript">// 标准的工厂模式,会有对应的参数

function createDumpling(pi,mian,xian,tioliao){
    // 创建包饺子对象
    const dumpling = {};

    // 给包饺子对象,添加属性
    dumpling.pi = pi;
    dumpling.xian = xian;
    dumpling.mian = mian;
    dumpling.tiaoliao = tiaoliao;

    // 给包饺子对象,添加方法

    // 和面
    dumpling.huomian = function(){
        console.log(this.mian);
    };

    // 和饺子馅
    dumpling.huoxian = function(){
        console.log(this.xian);
    };

    // 包饺子
    dumpling.bao = function(){
        console.log(this.xian,this.pi,this,mian);
    };

    // 煮饺子
    dumpling.zhu = function(){
        console.log('煮饺子了,等着吃吧');
    };

    // 返回包饺子对象
    return dumpling;
}

// 要开始包饺子

// 创建一个执行包饺子功能的对象,并且输入参数

const baojiaozi1 = createDumpling('薄皮' , '白面粉' , '猪肉大葱');

const baojiaozi2 = createDumpling('厚皮' , '玉米面' , '鱼香肉丝');


console.log(baojiaozi1);
// 可以调用任意的封装的方法
baojiaozi1.huoxian();   // 调用和饺子馅方法
baojiaozi1.huomian();     // 调用和面方法

构造函数

所谓的构造函数,实际也是一种函数
构造函数专门用于生成,定义对象的
通过构造函数生成的对象,称为实例化对象。
例如:

创建对象的方法,有两种:
字面量  const obj = {};
构造函数  const obj = new Object();
这个构造函数,就是JavaScript程序定义好的构造函数,我们直接使用就可以了。

强调

构造函数: 就是一种函数,是专门用于生成对象的函数
实例化对象: 就是通过构造函数生成的对象,称为实例化对象

分类

构造函数分为两种:
一种是JavaScript程序定义好的构造函数,称为 内置构造函数
一种是程序员自己定义的构造函数,称为 自定义构造函数

构造函数和普通函数的区别

1. 构造函数一定要和 关键词 new 一起使用
 	new 关键词具有特殊的功能,
 	会自动的给 构造函数中 定义一个对象,并且返回这个对象
 	我们只要对这个对象设定属性,设定方法就可以了
2. 构造函数为了和其他函数区别
 	语法规范规定,构造函数,函数名称,第一个字母必须大写,使用大驼峰命名法
3. 构造函数,给对象定义属性和方法的语法,与一般函数不同

注:实例化对象和普通的对象,没有任何的区别,只是建立方式不同而已。

如何自定义构造函数

注意:1. 函数名称要使用大驼峰命名法
	 2. 自定义构造函数中,不要 定义对象 和 定义return
    new 关键词会执行,如果定义了,会产生冲突
实例
javascript">function CrtObj(name,age,sex,addr){
    // 在构造函数中,使用this,来指代对象
    // 这个对象,就是我们使用构造函数,生成的实例化对象
    
    // 定义属性
    // 给实例化对象,添加name属性,属性值是输入的name参数
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.addr = addr;

    // 定义方法
    this.funAll = function(){
        console.log(this.name,this.age,this.sex,this.addr )
    };
    this.funNameAge = function(){
        console.log(this.name,this.age)
    };
    this.funSexAddr = function(){
        console.log(this.sex,this.addr )
    }

}

// 通过自定义构造函数来生对象,实例化对象
// 调用执行构造函数时,都必须要和new 关键词一起使用
const obj1 = new CrtObj('张三',18,'男','北京');
console.log(obj1);
// 调用 对象/实例化对象 中的方法
obj1.funAll();
obj1.funNameAge();
obj1.funSexAddr();
总结

new 的作用

1. 在构造函数中,自行创建一个对象,并且返回这个对象
2. 因为new 关键词创建了对象,此时,构造函数中的this,才会指向这个对象
   也就是将来生成的实例化对象
3. 所有的构造函数中,this的指向,都是将来通过这个构造函数生成的实例化对象

构造函数中的小问题

问题的产生

实例
javascript">// 自定义构造函数
function CrtObj(name, age, sex, addr) {
    // 定义属性
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.addr = addr;
    // 定义方法
    this.funAll = function () {
        console.log(this.name, this.age, this.sex, this.addr);
    }
}

// 定义了构造函数,可以生成实例化对象
const obj1 = new CrtObj('张三',18,'男','北京');
const obj2 = new CrtObj('李四',19,'女','上海');
const obj3 = new CrtObj('王五',20,'不详','火星');

// 每个实例化对象中,都有属性和方法

console.log(obj1);
console.log(obj2);
console.log(obj3);

通过同一个构造函数,生成的实例化对象
属性相同,属性值可能不同
定义的方法的程序,是相同的
但是,如果做一个比较判断,结果是 false

javascript">console.log( obj1.funAll == obj2.funAll );
原因
每次创建对象,都会在对象上定义一个新的方法,也就是新的函数
函数存储时会生成一个独立的存储空间,不同函数有不同的存储空间

这表示 不同的实例化对象中,定义的是不同的方法/函数
不同的方法和函数,会占用过多的内存空间
要想办法,让使用同一个构造函数,生成的实例化对象,都是相同的方法。

解决的方式

将构造函数需要定义给实例化对象的方法,定义在函数的 prototype 属性中。

实例
javascript">function CrtObj2(name, age, sex, addr) {
    // 定义属性
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.addr = addr;
}
// 在构造函数的 prototype 属性中,来定义实例化对象的方法
CrtObj2.prototype.fun = function(){
    console.log(this.name, this.age, this.sex, this.addr);
};

const obj4 = new CrtObj2('张三',18,'男','北京');
const obj5 = new CrtObj2('李四',19,'女','上海');

console.log(obj4);
console.log(obj5);

obj4.fun();

console.log( obj4.fun === obj5.fun );

http://www.niftyadmin.cn/n/1110704.html

相关文章

对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

记得在上大学那会开始,在大学的课堂上,常常会听到老师讲什么共享锁,排它锁各种锁的词汇,以前仅仅听过一次就没有管了,并没有进行深入的研究 最近,在各种群里,又看见了什么乐观锁、悲观锁什么鬼…

全文检索引擎Solr系列——整合MySQL、MongoDB

MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面配置E:\solr-4.8.0\example\solr\collection1\conf\solrconfig.xml123456<requestHandler name"/dataimport"class"org.apache.solr.handler.…

redis常见知识整理

为什么说Redis是单线程的以及Redis为什么这么快&#xff01; 主从同步&#xff08;复制&#xff09; https://www.nowcoder.com/discuss/92610 I/O多路复用。只有单个线程(一个快递员)&#xff0c;通过跟踪每个I/O流的状态(每个快递的送达地点)&#xff0c;来管理多个I/O流。 1…

Linux下用PHP实现XML备份Mysql数据库(转)

Linux下用PHP实现XML备份Mysql数据库(转)[more]以下是在Linux下通过ApachePHP对Mysql数据库的备份的文件代码&#xff1a; 文件一、Listtable.php &#xff08;文件列出数据库中的所有表格&#xff0c;供选择备份&#xff09; 请选择要备份的表格: $conmysql_connect(localhost…

深入springboot原理——一步步分析springboot启动机制(starter机制)

文章主目录 前言起步依赖自动配置总结 前言 使用过springboot的同学应该已经知道&#xff0c;springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程。本文的目的就是一步步分析springboot的启动过程&#xff0c;分析springboot是如何帮我们简…

JavaScript ES6的构造函数语法

ES5的构造函数有一些问题 最大的问题&#xff0c;就是定义 prototype 是在函数之外定义的 调用构造函数&#xff0c;生成实例化对象&#xff0c;一定要在定义 prototype 之后 否则生成的实例化对象&#xff0c;只有属性没有函数方法 ES6中&#xff0c;新增语法形式 class 类 是…

哪些数据科学技能是雇主所需要的

2019独角兽企业重金招聘Python工程师标准>>> 这是一个好消息&#xff0c;如果你希望在2016年找一份数据科学的工作—在该领域职位空缺的数量正在不断增加&#xff0c;企业希望利用大数据来获得竞争优势。但事实上&#xff0c;找一份梦寐以求的数据科学工作就意味着你…

LINUX之RPM查询篇(转)

LINUX之RPM查询篇(转)[more]RPM不仅在安装,升级,卸载方面工作出色,而且在查询方面比其它软件包管理工具更胜一筹。这从以下几种情况可以看出: * 当你在浏览系统文件时,发现一个文件,想知道它来自哪个软件包时,可以用RPM来查询得知; * 当你的朋友给你发送来一个软件包,但你不知道…