五金店网站模板/seo关键词优化排名
面向对象OOP
- 首先,我们要明确,面向对象不是语法,是一个思想,是一种 编程模式
- 面向: 面(脸),向(朝着)
- 面向过程: 脸朝着过程 =》 关注着过程的编程模式
- 面向对象: 脸朝着对象 =》 关注着对象的编程模式
- 实现一个效果
- 在面向过程的时候,我们要关注每一个元素,每一个元素之间的关系,顺序,。。。
- 在面向对象的时候,我们要关注的就是找到一个对象来帮我做这个事情,我等待结果
- 例子 🌰: 我要吃面条
- 面向过程
- 用多少面粉
- 用多少水
- 怎么和面
- 怎么切面条
- 做开水
- 煮面
- 吃面
- 面向对象
- 找到一个面馆
- 叫一碗面
- 等着吃
- 面向对象就是对面向过程的封装
- 面向过程
- 我们以前的编程思想是,每一个功能,都按照需求一步一步的逐步完成
- 我们以后的编程思想是,每一个功能,都先创造一个 面馆,这个 面馆 能帮我们作出一个 面(完成这个功能的对象),然后用 面馆 创造出一个 面,我们只要等到结果就好了
面向对象的编程语言 c++ java js python php 大前端 安卓(java) iOS(swift oc) js跨端框架
面向过程编程语言 c
面向对象的三大特点
封装、继承、多态
封装函数 封装对象(属性和方法)
Math.random new Array a.push
创建对象的方式
- 因为面向对象就是一个找到对象的过程
- 所以我们先要了解如何创建一个对象
调用系统内置的构造函数创建对象
-
js 给我们内置了一个 Object 构造函数
-
这个构造函数就是用来创造对象的
-
当 构造函数 和 new 关键字连用的时候,就可以为我们创造出一个对象
-
因为 js 是一个动态的语言,那么我们就可以动态的向对象中添加成员了
// 就能得到一个空对象 var o1 = new Object() // 正常操作对象 o1.name = 'Jack' o1.age = 18 o1.gender = '男'
字面量的方式创建一个对象
-
直接使用字面量的形式,也就是直接写
{}
-
可以在写的时候就添加好成员,也可以动态的添加
// 字面量方式创建对象 var o1 = {name: 'Jack',age: 18,gender: '男' }// 再来一个 var o2 = {} o2.name = 'Rose' o2.age = 20 o2.gender = '女'
使用工厂函数的方式创建对象
-
先书写一个工厂函数
-
这个工厂函数里面可以创造出一个对象,并且给对象添加一些属性,还能把对象返回
-
使用这个工厂函数创造对象
// 1. 先创建一个工厂函数 function createObj() {// 手动创建一个对象var obj = new Object()// 手动的向对象中添加成员obj.name = 'Jack'obj.age = 18obj.gender = '男'// 手动返回一个对象return obj }// 2. 使用这个工厂函数创建对象 var o1 = createObj() var o2 = createObj()
使用自定义构造函数创建对象
-
工厂函数需要经历三个步骤
- 手动创建对象
- 手动添加成员
- 手动返回对象
-
构造函数会比工厂函数简单一下
- 自动创建对象
- 手动添加成员(属性和方法)
- 自动返回对象
-
先书写一个构造函数
-
在构造函数内向对象添加一些成员
-
使用这个构造函数创造一个对象(和 new 连用)
-
构造函数可以创建对象,并且创建一个带有属性和方法的对象
-
面向对象就是要想办法找到一个有属性和方法的对象
-
面向对象就是我们自己制造 构造函数 的过程
// 1. 先创造一个构造函数 function Person(name, gender) {this.age = 18this.name = namethis.gender = gender }// 2. 使用构造函数创建对象 var p1 = new Person('Jack', 'man') var p2 = new Person('Rose', 'woman')
构造函数详解
- 我们了解了对象的创建方式
- 我们的面向对象就是要么能直接得到一个对象
- 要么就弄出一个能创造对象的东西,我们自己创造对象
- 我们的构造函数就能创造对象,所以接下来我们就详细聊聊 构造函数
构造函数的基本使用
-
和普通函数一样,只不过 调用的时候要和 new 连用,不然就是一个普通函数调用
function Person() {} var o1 = new Person() // 能得到一个空对象 var o2 = Person() // 什么也得不到,这个就是普通函数调用
- 注意: 不写 new 的时候就是普通函数调用,没有创造对象的能力
-
首字母大写
function person() {} var o1 = new person() // 能得到一个对象function Person() {} var o2 = new Person() // 能得到一个对象
- 注意: 首字母不大写,只要和 new 连用,就有创造对象的能力
-
当调用的时候如果不需要传递参数可以不写
()
,建议都写上function Person() {} var o1 = new Person() // 能得到一个空对象 var o2 = new Person // 能得到一个空对象
- 注意: 如果不需要传递参数,那么可以不写 (),如果传递参数就必须写
-
构造函数内部的 this,由于和 new 连用的关系,是指向当前实例对象的
function Person() {console.log(this) } var o1 = new Person() // 本次调用的时候,this => o1 var o2 = new Person() // 本次调用的时候,this => o2
- 注意: 每次 new 的时候,函数内部的 this 都是指向当前这次的实例化对象
-
因为构造函数会自动返回一个对象,所以构造函数内部不要写 return
- 你如果 return 一个基本数据类型,那么写了没有意义
- 如果你 return 一个引用数据类型,那么构造函数本身的意义就没有了
使用构造函数创建一个对象
-
我们在使用构造函数的时候,可以通过一些代码和内容来向当前的对象中添加一些内容
function Person() {this.name = 'Jack'this.age = 18 }var o1 = new Person() var o2 = new Person()
- 我们得到的两个对象里面都有自己的成员 name 和 age
-
我们在写构造函数的时候,是不是也可以添加一些方法进去呢?
function Person() {this.name = 'Jack'this.age = 18this.sayHi = function () {console.log('hello constructor')} }var o1 = new Person() var o2 = new Person()
- 显然是可以的,我们的到的两个对象中都有
sayHi
这个函数 - 也都可以正常调用
- 显然是可以的,我们的到的两个对象中都有
-
但是这样好不好呢?缺点在哪里?
function Person() {this.name = 'Jack'this.age = 18this.sayHi = function () {console.log('hello constructor')} }// 第一次 new 的时候, Person 这个函数要执行一遍 // 执行一遍就会创造一个新的函数,并且把函数地址赋值给 this.sayHi var o1 = new Person()// 第二次 new 的时候, Person 这个函数要执行一遍 // 执行一遍就会创造一个新的函数,并且把函数地址赋值给 this.sayHi var o2 = new Person()
- 这样的话,那么我们两个对象内的
sayHi
函数就是一个代码一摸一样,功能一摸一样 - 但是是两个空间函数,占用两个内存空间
- 也就是说
o1.sayHi
是一个地址,o2.sayHi
是一个地址 - 所以我们执行
console.log(o1 === o2.sayHi)
的到的结果是false
- 缺点: 一摸一样的函数出现了两次,占用了两个空间地址
- 这样的话,那么我们两个对象内的
-
怎么解决这个问题呢?
- 就需要用到一个东西,叫做 原型,后面讲
es6新增的类和继承
class的写法及继承JavaScript 语言中,生成实例对象的传统方法是通过构造函数。下面是一个例子
function Point(x, y) {this.x = x;this.y = y;}Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';};var p = new Point(1, 2);
上面这种写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习这门语言的程序员感到困惑。
定义类
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class
关键字,可以定义类。 基本上,ES6 的class
可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class
写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class
改写,就是下面这样。
//定义类
class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}}
上面代码定义了一个“类”,可以看到里面有一个constructor
方法,这就是构造方法,而this
关键字则代表实例对象。也就是说,ES5 的构造函数Point
,对应 ES6 的Point
类的构造方法 point
类除了构造方法,还定义了一个toString
方法。注意,定义“类”的方法的时候,前面不需要加上function
这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
/
point.hasOwnProperty('x') // true
point.hasOwnProperty('y') // true
ES6 的类,完全可以看作构造函数的另一种写法 class Point {// ...} typeof Point // "function"上面代码表明,类的数据类型就是函数,类本身就指向构造函数
let methodName = 'getArea';class Square {//构造函数constructor(length) {// ...}//实例方法 对象方法[methodName]() {// ...}}//实例方法 对象方法wang(){}
上面代码中,Square
类的方法名getArea
,是从表达式得到的。
类内部,默认就是严格模式,所以不需要使用use strict
指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。 考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 类实际上把整个语言升级到了严格模式。
constructor 方法
constructor
方法是类的默认方法,通过new
命令生成对象实例时,自动调用该方法。一个类必须有constructor
方法,如果没有显式定义,一个空的constructor
方法会被默认添加。 class Point {}// 等同于class Point { constructor() {}}上面代码中,定义了一个空的类Point
,JavaScript 引擎会自动为它添加一个空的constructor
方法。 constructor
方法默认返回实例对象(即this
)
类必须使用new
调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new
也可以执行。
class Foo { constructor() { }} Foo()// TypeError: Class constructor Foo cannot be invoked without 'new'
生成类的实例对象的写法,与 ES5 完全一样,也是使用new
命令。前面说过,如果忘记加上new
,像函数那样调用Class
,将会报错。 class Point {// ...}// 报错var point = Point(2, 3);// 正确var point = new Point(2, 3);
类不存在变量提升(hoist),这一点与 ES5 完全不同。 new Foo(); // ReferenceErrorclass Foo {}
类方法
加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
class Foo { static classMethod() { return 'hello'; }} Foo.classMethod() // 'hello'var foo = new Foo();foo.classMethod()// TypeError: foo.classMethod is not a function
上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,可以直接在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。
继承
类的继承Class 可以通过extends
关键字实现继承 这比 ES5 的通过修改原型链(在后面章节会讲解)实现继承,要清晰和方便很多。
class Point {}class ColorPoint extends Point {}
上面代码定义了一个ColorPoint
类,该类通过extends
关键字,继承了Point
类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Point
类。下面,我们在ColorPoint
内部加上代码。
class ColorPoint extends Point {constructor(x, y, color) {super(x, y); // 调用父类的constructor(x, y)this.color = color;}toString() {return this.color + ' ' + super.toString(); // 调用父类的toString()}}
上面代码中,constructor
方法和toString
方法之中,都出现了super
关键字,它在这里表示父类的构造函数,用来新建父类的this
对象。 ES6 要求,子类的构造函数必须执行一次super
函数
子类必须在constructor
方法中调用super
方法,否则新建实例时会报错。这是因为子类自己的this
对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super
方法,子类就得不到this
对象。
class Point { /* ... */ }class ColorPoint extends Point {constructor() {}}let cp = new ColorPoint(); // ReferenceEr
上面代码中,ColorPoint
继承了父类Point
,但是它的构造函数没有调用super
方法,导致新建实例时报错。
需要注意的地方是,在子类的构造函数中,只有调用super
之后,才可以使用this
关键字,否则会报错。这是因为子类实例的构建,是基于对父类实例加工,只有super
方法才能返回父类实例
class Point {constructor(x, y) {this.x = x;this.y = y;}}class ColorPoint extends Point {constructor(x, y, color) {this.color = color; // ReferenceErrorsuper(x, y);this.color = color; // 正确}}
上面代码中,子类的constructor
方法没有调用super
之前,就使用this
关键字,结果报错,而放在super
方法之后就是正确的。
总结
-
到了这里,我们就发现了面向对象的思想模式了
- 当我想完成一个功能的时候
- 先看看内置构造函数有没有能给我提供一个完成功能对象的能力
- 如果没有,我们就自己写一个构造函数,能创造出一个完成功能的对象
- 然后在用我们写的构造函数 new 一个对象出来,帮助我们完成功能就行了
-
比如: tab选项卡
- 我们要一个对象
- 对象包含一个属性:是每一个点击的按钮
- 对象包含一个属性:是每一个切换的盒子
- 对象包含一个方法:是点击按钮能切换盒子的能力
- 那么我们就需要自己写一个构造函数,要求 new 出来的对象有这些内容就好了
- 然后在用构造函数 new 一个对象就行了
相关文章:

【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(六)
面向对象OOP 首先,我们要明确,面向对象不是语法,是一个思想,是一种 编程模式面向: 面(脸),向(朝着)面向过程: 脸朝着过程 》 关注着过程的编程模…...

hbase启动错误-local host is“master:XXXX“ destination is:master
博主的安装前提: zookeeper安装完成,且启动成功 hdfs高可用安装,yarn高可用安装,且启动成功 报错原因:端口配置不对 解决方案: 输入:hdfs getconf -confKey fs.default.name 然后把相应的…...

基于SpringBoot的“招生管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“招生管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 学生注册界面图 …...

Chinese-LLaMA-Alpaca-2模型量化部署测试
简介 Chinese-LLaMA-Alpaca-2基于Meta发布的可商用大模型Llama-2开发, 是中文LLaMA&Alpaca大模型的第二期项目. 量化 模型的下载还是应用脚本 bash hfd.sh hfl/chinese-alpaca-2-13b --tool aria2c -x 8应用llama.cpp进行量化, 主要参考该教程. 其中比较折腾的是与BLAS…...

flutter 打包成web应用后怎么通过url跳转页面
在 Flutter 中,如果你想要在打包成 Web 应用后通过 URL 跳转页面,你可以利用 Flutter 提供的路由导航系统和 URL 策略。以下是具体步骤: 1. 配置路由 在 Flutter 应用中定义路由,一种简单的方式是使用 MaterialApp 构造器的 rou…...

【设计模式】中介者模式的应用
文章目录 1.概述2.中介者模式的适用场景2.1.用户界面事件2.2.分布式架构多模块通信 3.总结 1.概述 中介者模式(Mediator Pattern)是一种行为型设计模式,它用于解决对象间复杂、过度耦合的问题。当多个对象(一般是两个以上的对象&…...

【微服务篇】分布式事务方案以及原理详解
分布式事务是指事务参与者、资源服务器、事务管理器分布在不同的分布式系统的多个节点之上的事务。在微服务架构、大型分布式系统和云计算等环境中,由于系统间调用和资源访问的复杂性,分布式事务变得尤为重要。 应用场景 跨系统交易:当交易…...

String 类的常用方法都有那些?
String 类在 Java 中是一个非常重要的类,用于处理文本数据。它提供了许多方法来操作字符串。以下是一些 String 类的常用方法: 构造方法 String(): 创建一个新的空字符串对象。String(byte[] bytes): 使用指定的字节数组来创建一个新的 String 对象。S…...

用XMLHttpRequest发送和接收JSON数据
百度的AI回答了一个案例: var xhr new XMLHttpRequest(); var url "your_endpoint_url"; // 替换为你的API端点 var data JSON.stringify({key1: "value1",key2: "value2" });xhr.open("POST", url, true); xhr.setReq…...

华为云使用指南02
5.使用GitLab进行团队及项目管理 GitLab旨在帮助团队进行项目开发协作,为软件开发和运营生命周期提供了一个完整的DevOps方案。GitLab功能包括:项目源码的管理、计划、创建、验证、集成、发布、配置、监视和保护应用程序等。该镜像基于CentOS操…...

halcon目标检测标注保存
* 创建一个新的字典 create_dict(ObjectDictionary) * 类别名称列表和对应的ID列表 class_names : [Defect1,Defect2,Defect3,Defect4,Defect5,Defect6,Defect7,Defect8,Defect9,Defect10,Defect11,Defect12,Defect13,Defect14,Defect15,Defect16,Defect17,Defect18] class_id…...

Python图像处理——计算机视觉中常用的图像预处理
概述 在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理…...

编译安装飞桨fastdeploy@FreeBSD(失败)
FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160 Text,Vision, Speech和跨模态模型📦开箱即用的部署体验,并实现🔚端到端的推理性能优化。包括 物…...

java组合总和(力扣Leetcode39)
组合总和 力扣原题链接 问题描述 给定一个无重复元素的整数数组 candidates 和一个目标整数 target,找出 candidates 中可以使数字和为目标数 target 的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。 示例 示例 1: 输…...

ZK友好代数哈希函数安全倡议
1. 引言 前序博客: ZKP中的哈希函数如何选择ZK-friendly 哈希函数?snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式:高效的ZK友好的哈希函数Tip5:针对Recursive STARK的哈希函数 随着Incrementally Ve…...

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储
简介 博客:https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则,这组规则定义了数据对象在 vSAN 存储上是如何保存的,存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…...

JUC内容概述
复习概念 Sleep和Wait的区别 Sleep是Thread的静态方法,wait是Object的方法,任何对象实例都可以使用sleep不会释放锁,他也不需要占用锁,暂停。wait会释放锁,但是调用他的前提是线程占有锁他们都可以被Interrupted方法…...

postcss安装和使用
要安装和使用 PostCSS,你可以按照以下步骤操作: 步骤一:安装 PostCSS 在项目目录下,通过 npm 初始化一个新的 package.json 文件(如果还没有): npm init -y 安装 PostCSS 和必要的插件&#x…...

macOS 13 Ventura (苹果最新系统) v13.6.6正式版
macOS 13 Ventura是苹果电脑的全新操作系统,它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验,同时优化了邮件、Safari浏览器和日历等内置应用程序,使其更加流畅、快速和安全。特别值得一提的是,…...

WordPress Git主题 响应式CMS主题模板
分享的是新版本,旧版本少了很多功能,尤其在新版支持自动更新后,该主题可以用来搭建个人博客,素材下载网站,图片站等 主题特点 兼容 IE9、谷歌 Chrome 、火狐 Firefox 等主流浏览器 扁平化的设计加响应式布局&#x…...

安卓国内ip代理app,畅游网络
随着移动互联网的普及和快速发展,安卓手机已经成为我们日常生活和工作中不可或缺的一部分。然而,由于地理位置、网络限制或其他因素,我们有时需要改变或隐藏自己的IP地址。这时,安卓国内IP代理App便成为了一个重要的工具。虎观代理…...

Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本
目录 MXSS UXSS:Universal Cross-Site Scripting HTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到) SVG-XSS PDF-XSS Python生成XSS Flash-XSS 知识点: 1、XSS跨站-MXSS&UXSS 2、XSS跨站-SVG制作&配合上传 3、XSS跨站-…...

k8s安装traefik作为ingress
一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …...

如何在Windows 10中打开屏幕键盘?这里有详细步骤
本文解释了在Windows 10中打开或关闭屏幕键盘的不同方法,还解释了如何将屏幕键盘固定到开始菜单。 使用屏幕键盘的快捷键 如果你喜欢快捷方式,你会喜欢这个:按物理键盘上的WinCTRLO。这将立即显示屏幕键盘,而无需通过轻松使用。…...

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果
目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …...

python-numpy-常用函数详解
文章目录 一、函数详解np.empty(num_points)np.zeros(shape, dtypefloat, orderC)np.tile(A, reps)np.newaxisnumpy.stack(arrays, axis0)np.roll(a, shift, axisNone) 二、实例矩阵进行扩展三行,使得每一行都与第一行相同二维数组每行减去不同的数 一、函数详解 n…...

UE小:基于UE5的两种Billboard material(始终朝向相机材质)
本文档展示了两种不同的效果,分别是物体完全朝向相机和物体仅Z轴朝向相机。通过下面的演示和相关代码,您可以更加直观地理解这两种效果的差异和应用场景。 1. 完全朝向相机效果 此效果下,物体将完全面向相机,不论相机在哪个角度…...

spring boot actuator 安全配置 springboot的安全性
关于springboot Actuator框架的安全配置方案: 加入security安全验证框架 方案一: 配置信息: spring:security:user:password: adminname: adminmanagement:endpoints:web:base-path: /monitorexposure:include: "*"# 排除端点e…...

macOS Sonoma如何查看隐藏文件
在使用Git进行项目版本控制时,我们可能会遇到一些隐藏文件,比如.gitkeep文件。它通常出现在Git项目的子目录中,主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时,使用Terminal命令来显示隐藏文件 default…...

深入浅出:语言模型的原理、实战与评估
深入浅出:语言模型的原理、实战与评估 1. 引言1.1. 关于语言模型1.2. 语言模型的重要性 2. 语言模型简介2.1. 语言模型的类型2.2. 技术演进 3. 语言模型的原理3.1. 概率基础3.2. 深度学习模型 4. 语言模型的实战应用4.1. 数据准备4.2. 模型训练4.3. 应用场景 5. 语言…...