精华内容
下载资源
问答
  • 面向对象的概念介绍
    万次阅读 多人点赞
    2018-08-24 09:02:18

    继续讲程序基础。这一篇主要是介绍面向对象的各种概念性的东西,并不会说具体的代码怎样写,所以可以用一种轻松的心态去看。

    一、面向过程和面向对象

    面向对象是相对于面向过程的一种编程方式。

    面向过程的编程方式由来已久,我刚开始学习Basic和Pascal的时候,都是面向过程的编程方式。这种方式非常的直观,需要写一个功能,直接就写几行实现方法。比如你需要操作一个人移动到某个点,直接就写代码修改一个人的坐标属性,逐格的让他移动到目标点就行了。

    面向对象的编程方式,操作的是一个个的对象,比如你还是需要操作一个人的移动,你需要先实例化那个人的一个管理类对象,然后告诉这个“人”的对象,你需要移动到什么地方去。然后人就自己走过去了。至于具体是怎样走的,外部不关心,只有“人”对象本身知道。

    面向对象有优点也有缺点,也存在一些争论的地方。确实,面向对象在性能上面肯定不如面向过程好,毕竟面向对象需要实例化对象,需要消耗cpu和内存。但我觉得它的优点也是很明显的,毕竟在一个大型的项目里面,面向对象易于维护和管理,条理也清晰,是一种重要的编程思想。

    二、面向对象的4大特征

    只要稍微百度一下,就能知道面向对象有4大基本特征:封装、继承、多态、抽象。估计背下来很容易,但实际上它们具体的含义是什么呢?

    接下来,我以一家银行为例子,大概说一下我对面向对象这几个特征的理解。

    1、封装:

    对于一般人来说,银行的印象就只有一排对外办公的窗口,然后有存款和取款2种基本业务。

    银行是一个结构非常复杂,功能非常众多的机构。但实际上,我们并不会很关心它的内部是怎样运作的,比如银行的员工是怎样数钱的,怎样记录存款,怎样开保险柜,等等。这些对于外部的人员来说,知道了可能会引起更多不必要的麻烦。所以银行只需要告诉你,你可以在这个窗口办理业务,可以存款和取款,就够了。

    所谓的封装,就是指把内部的实现隐藏起来,然后只暴露必要的方法让外部调用。

    2、继承:

    刚才提到了银行有2种最基本的业务,存款和取款。但现实中,大部分的银行都不止这两种业务,还有很多其他的业务,比如投资窗口、办理对公业务的窗口等等。这些业务,是在最基本的银行存取款业务的基础上再添加的,所以我们可以理解成,基本的银行是只有2种业务的,然后后来的银行在保留了原有银行的业务基础上,再扩展了其他的业务。

    如果把基本的银行看做父类(基类),包含存款和取款2个公共方法,那么后来的银行可以看做是子类,它在继承了基本银行存取款的公共方法只后,还自己新增了投资和对公业务两个公共方法。有些银行甚至会重写基本的存取款功能,让自己和基本银行的业务有一定的区别。这个过程,就是继承。

    3、多态:

    同样是存款的业务,如果我拿着人民币和拿着美元去银行办理,实际上银行处理的方式是不一样的。这种办理同一种业务(公共方法),由于给予的内容(传入的参数类型或者数量)不一样,而导致操作(最终实现的方法)不一样,叫做编译多态,也叫做函数的重载。

    接下来,我去了一家银行存款,我不知道这家银行的存款业务有没有和基本银行不一样,反正我就是把钱存进去了,然后具体业务的实现究竟是调用了基本银行存款功能,还是这家银行本身有新的存款功能实现,我是不关心的。这种外部直接调用一个方法接口,然后具体实现的内容由实际处理的类来决定使用基类或者子类的方法,就叫做运行时多态。

    4、抽象:

    有些观点并没有把抽象列为面向对象的特征。但实际上这是面向对象的一个本质的东西。

    虽然银行五花八门,但我们可以找到他们的共性,比如上面说的,基本的银行有存取款业务,投资银行有投资业务,之类,其实就是对银行作出了一个抽象的看法。

    在操作的时候,这些业务其实就是一个个的接口,我不管面对的是什么具体的银行,只要是同一个类型的银行,我都可以进行相同的业务办理。

    三、面向对象业务的参与角色和边界划分

    除了几大特征以外,面向对象在使用的时候有几个概念:参与者、边界、业务主体、业务工人。

    这几个概念好像很高端大气,但实际上归纳成一句话,就是“谁做什么,做到什么程度”。

    比如“你去银行存钱”,参与人是你自己,业务主体是存钱,业务工人是银行职员,边界就是到存钱为止。

    这里的确定边界是一个很重要的概念。面向对象操作的对象实际上是可大可小的,在不同的业务过程里面,参与者和业务的主体是可以改变的的。

    还是存钱这件事情,参与者是你自己,但其实包含了一系列后续的操作。比如银行职员在拿到你的钱之后,需要用点钞机去数一下。这个“职员点钞”的过程,实际上是一个子业务,这个业务包含在存款的总业务里面,但是不需要客户去关心。这时候业务的参与者变成了银行职员,业务主体是点钞,业务工人变成了点钞机,业务的边界也只划分到点钞本身。

    存款实际上是一个复杂的业务过程,又很多诸如点钞这样的子业务组成了一个大的存款业务,然后如果把存款和取款之类业务看成子业务,这些子业务又组成了银行这个复杂的总业务机构。如果把银行看成是子业务,和商场、市场、交通等子业务,共同的又组成了我们的生活这个更复杂的大业务,把每个人的生活看成是子业务,然后每个人的生活又组成了国家。如此类推,组成了地球、组成了宇宙,无穷无尽……

    根据不同的业务边界的划分,我们得到了不同的范围和结果。每一个子的业务,是独立的,我们可以单独的修改它们。比如点钞这个操作,我们可以不用点钞机,改为用手点钞,也能达到同样的结果。再通过一个个子的对象,组合成庞大的复杂的系统。只要我们划分的边界足够的清晰和明确,就可以有条不紊的做各种复杂的功能。这正是面向对象为什么能容易维护和管理的原因。

    四、面向对象的一些个人看法

    在多年的程序员工作当中,我有幸看到过不少项目的代码,发现有这么一种情况,有些人写程序,喜欢很刻意的去写面向对象,为某些类提取了的基类,提取了很多接口,但到了真正去写实现代码的时候反而不知道该怎样去用这些接口。

    也有人问过我,抽象是怎样做到的,比如,他写代码都是按功能先写了类,然后发现类有很多可以重用的地方,再提取成接口,原来的类就变成基类,然后再继承,等等。不是说一般开发都需要围绕接口来开展吗?着好像有点矛盾了。

    对于这个问题,我只能谈谈我自己的经验。

    按照统一建模语言的理论,其实在实际使用某种语言编写功能之前,应该是有设计阶段的。这个阶段只是弄清楚业务的参与者、边界、业务主体、业务工人等元素,然后归结成“谁做什么”。这个阶段,我们不需要知道是用什么编程语言来实现的,也许根本不需要计算机,用纯人工也能完成功能。

    这个阶段也不需要我们知道怎样具体去实现一个功能,只需要知道,我需要在这个范围内实现什么样的几个功能,我需要对外提供什么样的服务让别人使用,就算完成了。然后再下一步,才是讨论使用什么语言来实现,怎样去根据语言的特点去实现。最后才是真正的开始打代码把实现的过程写出来。

    针对上面的实现过程,不难发现,其实我们在没有开始写代码之前,我们就已经知道我们需要做什么,需要提供哪一些对外的窗口给别人去用。这些窗口,其实就是抽象出来的接口了。

    所以,我自己的习惯是在写任何东西之前,都是先拿笔在纸上面把流程写一遍,把结构搞清楚,把数据的流动过程模拟一下。把思路搞清晰之后,就可以简单的把类的结构写一下,写虚方法,不需要具体实现,只是看看这样的抽象过程有没有问题。如果没问题了,再一个个的把虚方法的具体实现写完整。至于如果需求变动发现之前的抽象不足以应付,可以在有限范围内再进一步的抽象,提取子类,通过多态的方式来实现。

    更多相关内容
  • 听说你情人节没陪,这不我来给你介绍对象

    千次阅读 多人点赞 2022-02-14 23:45:34
    情人节没有对象的大兄弟看了我的文章,留下了感动的泪水!

    📜个人简介

    ⭐️个人主页:微风洋洋🙋‍♂️
    🍑博客领域:编程基础💡,后端💡,大数据,信息安全
    🍅写作风格:干货,干货,还是tmd的干货
    🌸系列专栏【JavaScript】
    🚀支持洋锅:点赞👍、收藏⭐、留言💬

    好久不见,甚是想念!
    大家好!我是微风洋洋 🚀
    情人节到了,但有的兄弟跟我说他没对象,这怎么能行?于是,我把我压箱底的东西拿出来了,我一定给得他好好介绍对象,传授他面向对象的概要,如果他对对象不满意,没事,那就让他自定义对象,直接一步到位,大兄弟看了我的文章,留下了感动的泪水。虽然自己没有对象,但是狠狠地给他人介绍了对象,这就是赠人玫瑰手留余香吧,人生圆满了。


    如果的你的好兄弟到情人节还没对象,请 点赞,收藏这篇文章,然后把这篇文章 转发给他,相信他一定会感谢你的 善意之举

    一、面向对象概述

    🍅面向过程与面向对象

    以完成一件事来说明什么是面向过程与面向对象。

    • 面向过程的解决办法:注重的是具体的步骤,只有按照步骤一步一步的执行,才能够完成这件事情。
    • 面向对象的解决办法:注重的是一个个对象,这些对象各司其职,我们只要发号施令,即可指挥这些对象帮我们完成任务。

    在这里插入图片描述

    📌 总结

    • 对于面向过程思想,我们扮演的是执行者,凡事都要靠自己完成。
    • 对于面向对象思想,我们扮演的是指挥官,只要找到相应的对象,让它们帮我们做具体的事情即可。

    • 面向过程思想的劣势
      编写的代码都是一些变量和函数,随着程序功能的不断增加,变量和函数就会越来越多,此时容易遇到命名冲突的问题,由于各种功能的代码交织在一起,导致代码结构混乱,变得难以理解、维护和复用。

    • 面向对象思想的优势
      可以将同一类事物的操作代码封装成对象,将用到的变量和函数作为对象的属性和方法,然后通过对象去调用,这样可以使代码结构清晰、层次分明。


    🍅面向对象的特征

    在这里插入图片描述

    🍑封装性

    封装:指的是隐藏内部的实现细节,只对外开放操作接口。

    接口:就是对象的方法,无论对象的内部多么复杂,用户只需知道这些接口怎么使用即可。

    举例:电脑是非常高精密的电子设备,其实现原理也非常复杂,而用户在使用时并不需要知道这些细节,只要操作键盘和鼠标就可以使用。


    优势:无论一个对象内部的代码经过了多少次修改,只要不改变接口,就不会影响到使用这个对象时编写的代码。

    在这里插入图片描述



    🍑继承性

    继承:是指一个对象继承另一个对象的成员,从而在不改变另一个对象的前提下进行扩展。

    举例1:动物与猫和狗的关系,人类的繁衍等。

    在这里插入图片描述

    在这里插入图片描述


    举例2:String对象就是对所有字符串的抽象,所有字符串都具有toUpperCase()方法,用来将字符串转换为大写,这个方法其实就是继承自String对象。

    优势

    • 可在保持接口兼容的前提下对功能进行扩展。
    • 增强了代码的复用性,为程序的修改和补充提供便利。



    🍑多态性

    多态:指的是同一个操作作用于不同的对象,会产生不同的执行结果。

    理解:实际上JavaScript被设计成一种弱类型语言(即一个变量可以存储任意类型的数据),就是多态性的体现。

    在这里插入图片描述

    在这里插入图片描述

    例如,数字、数组、函数都具有toString()方法,当使用不同的对象调用该方法时,执行结果不同。

    在这里插入图片描述

    📌 提示:在面向对象中,多态性的实现往往离不开继承,这是因为当多个对象继承了同一个对象后,就获得了相同的方法,然后根据每个对象的不同来改变同名方法的执行结果。

    📌 提示:虽然面向对象有封装、继承、多态这些设计思想,但并不表示只要满足这些特征就可以设计出优秀的程序,开发人员还需要考虑如何合理的运用这些特征。

    例1:在封装时,如何给外部调用者提供完整且最小的接口,使外部调用者可以顺利得到想要的功能,不需要研究其内部的细节。

    例2:在进行继承和多态设计时,对于继承了同一个对象的多种不同的子对象,如何设计一套相同的方法进行操作。



    二、自定义对象

    🍅对象的定义

    语法:对象的定义是通过“{ }”语法实现的。

    组成:对象以对象成员(属性和方法)构成,多个成员之间使用逗号分隔。

    成员:对象的成员以键值对的形式存放在{}中。

    在这里插入图片描述

    📌 注意

    “{ }”语法又称为对象的字面量语法,所谓字面量是指在源代码中直接书写的一个表示数据和类型的量,如123(数值型)、‘123’(字符型)、[123](数组)都是字面量。



    JSON数据格式

    JSON: JavaScript Object Notation,JavaScript对象符号。

    用途:应用于数据存储和交互。

    语法: JSON是一个字符串,使用双引号包裹对象的成员名和字符串型的值。

    JSON与对象的区别:

    • JSON是一个字符串。
    • JSON不仅可以用来保存对象,还可以保存数字、字符串、数组等其他类型的数据。

    在这里插入图片描述


    🍅访问对象成员

    语法:对象.成员。

    在这里插入图片描述

    可变成员名语法:对象[变量名] = 值。

    在这里插入图片描述


    🍅对象成员遍历

    语法:for…in。

    在这里插入图片描述

    • 变量k保存了每个对象成员的名称。
    • obj[k]访问成员属性的值。
    • objk调用成员方法。

    判断对象成员是否存在

    • 当需要判断一个对象中的某个成员是否存在时,可以使用in运算符。
    • 当对象的成员存在时返回true,不存在时返回false。
      在这里插入图片描述

    如果觉得这篇文章对你有一丢丢启发的话,不妨 点赞👍、收藏⭐、留言💬支持一下,你的支持将是我继续创作的最大动力❤️❤️❤️

    由于作者水平有限,如有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

    最后,祝天下有情人终成眷属,各位xdm今年必找到意中人!(这还不赏个关注)

    展开全文
  • JVM如何判断对象能否回收

    万次阅读 多人点赞 2019-12-16 16:11:57
    说起Java和C++,很容易想到让疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM相关原理,我们必须要面对这些...

    目录

    •写在前面

    •对象的创建

    •引用计数算法

    •可达性分析算法

    •引用

    •不可达必须“死”?

    •最后


    •写在前面

    说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM相关原理,我们必须要面对这些东西,深入了解JVM在内存动态分配和垃圾回收技术的原理知识,这篇文章就是来做一个先导,在jvm进行垃圾回收之前,它必须要知道回收的对象是否已“死”,这样才能保证程序的正常稳定。

    •对象的创建

    我们将回收对象前,先讲讲在虚拟机上,对象是怎么被创建的。在我们编写代码的角度(语言层面)来看,我们创建一个对象实例,只需要使用new关键词就完事儿了,很简单,不过你享受的简单是因为虚拟机帮你承受了所有繁琐的工作,那虚拟机是怎么工作创建一个对象的呢?

    当虚拟机遇到new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用(没有类,创建个锤子的对象),并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,那必须要执行相应的类加载过程。这是第一步,在类加载检查过后,接下来虚拟机将为新生对象分配内存,对象所需的内存大小在类加载完成后便已经完全确定了(这里插一句,如何确定的?这就和对象的内存布局有关了,对象在内存中的布局可以分为3个区域,分别是对象头、实例数据和对齐填充,对象头里面存的是对象自身的运行时数据,比如哈希码、GC分代年龄、锁状态、线程持有的锁、偏向线程ID等等之类的信息,也就是和储存数据无关的额外内存空间,按道理这一块空间应该是固定的,不过在设计上还是被弄成了非固定的数据结构,这样更具不同的类节省空间,不深入不然扯不完,想要可以看另外一篇文章。接下来实例数据就是对象真正储存的有效信息,也是程序代码中所定义的各种类型的字段内容。最后一个对齐填充,顾名思义就是填补空间,因为以HotSpotVM为例,对象的大小必须是8字节的整数倍,所以就靠这个补全),给对象分配空间的任务相当于把一块确定大小的内存从Java堆中划分出来(为啥可以看我另一篇文章,运行时数据区)。

    划分的时候会出现两种情况,第一种就是java堆中的内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间的一边移动对象大小相等的距离,这种分配方式就是“指针碰撞”。第二种情况就是空间不规整,也就是已使用的内存和空闲内存相互交错,这个时候指针碰撞起不来作用,那么这个时候虚拟机必须维护一个列表,记录哪些内存可用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新相关内存信息,这种方式叫做“空闲列表”。因为创建对象非常频繁,所以会涉及到并发的时候,会出现一个叫做“本地线程分配缓冲”的概念,我这里也不深入,自己去查,哈哈哈。空间分配完成之后,虚拟机需要分配到的内存空间都进行初始化为零值(注意不包括对象头),这样就保证对象的实例字段在java代码中可以不赋初始值就直接使用。最后虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息,对象的哈希码、对象的GC分代等信息。到此,对于虚拟机来说,对象创建完毕。

    •引用计数算法

    引用计数是一个很好理解的概念,就是给对象添加一个引用计数器,每当有一个地方引用这个对象时,计数器值加1,每当一个引用失效时,计数器减1,任何时刻计数器为0的对象就是不可能再被使用的。是不是很好理解,而且判定对象是否可用效率很高,在大部分时候它是一个很不错的算法,不过要注意,是大部分时候。在java虚拟机中,并没有使用这个算法来管理内存,其中最主要的原因就是它很难解决对象之间循环引用的问题。来,举个例子来理解,比如现在有两个对象objectA和objectB都有字段instance,赋值让objectA.instance = objectB, objectB.instance = objectA,除此之外没有任何其他引用,实际上这两个对象已经不可能再被访问了,但是因为它们两个互相引用这对方,导致它们的引用计数不为0,则算法不能通知GC收集器回收它们。所以这种算法不适合在虚拟机上使用,但是并不是说这个算法很垃圾,它可是在其他方面有很多著名的案例。

    •可达性分析算法

    JVM的主流实现是可达性分析,可达性分析在概念上其实也不难理解,它的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时(图论里面专业一点来说,就是从GC Roots到这个对象不可达),则证明对象是不可用的,大致可以像下图理解。

    那么哪些对象可以作为GC Roots对象呢?在java中大致有如下几种:

    •虚拟机栈(栈帧中的本地变量表)中引用的对象;(不知道栈帧是啥的看我另一篇文章,运行时数据区

    •方法区中类静态属性引用的对象;

    •方法区常量引用的对象;

    •本地方法栈中JNI(即一般说的Native方法)引用的对象;

    •引用

    引用是啥?搞过C++的我们第一反应就会回答,如果reference类型的数据中储存的数值代表的是另一个内存的起始地址,就称这块内存代表着一个引用。这种定义没有错,不过太狭隘了,一个对象在这种定义下只能被引用或者没有被引用两种状态,显然在回收中不足以应付碰到的情况。所以,java对引用概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种,这四种引用强度一次逐渐减弱。

    •强引用,就是指在程序代码之中普遍存在的,类似A a = new A()这样的引用,只要强引用存在,垃圾回收器就不会回收掉被引用的对象;

    •软引用,用来描述一些还有用但并非必须的对象,对于软引用的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会出现内存溢出异常;

    •弱引用,也是用来描述非必需的对象,但是它的强度比软引用更弱,被弱引用关联的对象只能生存到下一次回收发生之前,当垃圾回收器工作时,无论当前内存是否足够,都会回收掉;

    •虚引用,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象实例、为一个对象设置引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

    •不可达必须“死”?

    其实在实际中,就算在可达性分析算法中不可达的对象,也并非一定会回收,这个时候不可达的对象暂时处于暂缓的阶段,一个对象要真正宣告死亡,至少要经历两次标记的过程,当对象进行可达性分析而不可达时,它会被第一次标记并且进行一次筛选,筛选条件是这个对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被调用过了,虚拟机将会把这两种情况视为没有必要执行finalize。当对象被判定有必要执行finalize时,对象将会被放置在一个叫做F-Queue的队列中,并在稍后的一个由虚拟机自动建立的、优先级低的一个Finalizer线程去出发这些对象的finalize(要注意的是,虚拟机并不承诺会等待这些对象finalize方法执行结束,这是因为如果一个对象的finalize方法执行缓慢、或者发生死循环,将导致F-Queue队列其他对象处于永久等待,甚至导致内存回收系统崩溃)。finalize是对象逃脱回收的最后一次机会,GC会将F-Queue中的对象进行第二次小规模的标记,如果对象在finalize中重新和引用链连上了,那么就被移出回收集合,没有逃脱则将会被回收(要记住哦,对象的finalize只能被执行一次,也就是说当对象通过finalize逃脱回收之后,下一次如果再被可达性分析标记,那么就逃不了了)。

    •最后

    其实很多时候我们谈论回收都在java堆上进行的,上面对象实例都是在java堆上进行的,很少谈及方法区的回收,因为方法区(一般被称为永久代)中的回收条件很苛刻,比如在java堆上进行回收可以达到70%-95%的空间,在方法区却低很低,但并不代表方法区不能有垃圾回收,Java虚拟机规范中,只是说可以不要求在方法区实现回收机制。

    展开全文
  • (十)vue实例对象介绍

    千次阅读 2018-11-12 13:27:47
    前三个基本上已经讲了,我们直接来看实例对象的计算属性 (4)Computed 计算属性 1)什么是计算属性 1.计算属性即computed, 和前面我们讲的methods方法基本上一样。他们的写法都是函数形式。 2.不同的是,methods...

    (1)El 元素节点

    (2)Data 数据集合

    (3)Methods 方法集合

    前三个基本上已经讲了,我们直接来看实例对象的计算属性

    (4)Computed 计算属性

    1)什么是计算属性
    1.计算属性即computed, 和前面我们讲的methods方法基本上一样。他们的写法都是函数形式。
    2.不同的是,methods选项里面的是真正的函数,代表的是一段程序代码的集合,而写在computed的虽然写法也是函数,但实际上只是这些函数运行完后的返回结果。
    3.换句话说,当函数体完全一样的时候,执行后的methods==计算属性,如:函数fn()==计算属性fn。
    4.由于计算属性最终只是一个值,所有在dev-tools中会显示出计算属性来,而方法就不会显示。
    2)最简单的计算属性
    在这里插入图片描述
    在这里插入图片描述
    注意:
    1.如果你没有给计算属性显式的返回一个值,那么他会默认返回undefined.
    2.计算属性在使用时只是一个常量值,不是一个函数,无法传参!而methods里面的方法可以传参。
    3)为什么要使用计算属性(因为缓存)
    通过对methods和computed的了解,我们应该有了这样的一个认识,那就是计算属性能实现的,methods都能实现 (调用方法时加上一个括号就好了),而且由于可以传参,还显得更加的强大。
    那么,这种情况我们为什么还要使用计算属性呢?使用它还有什么意义呢?实际上,这也是基于性能的一个考虑,因为计算属性是有缓存的!
    只有计算属性引用的响应式属性(计算属性中包含的data中的属性字段)发生改变时才会重新计算,如果引用的属性没有改变,则调用上一次缓存值。而methods里的函数在每次调用时都要执行,每次值都是最新的。

    methods: {
    mfn: function () { return Date() }
    },
    computed: {
    cfn: function () { return Date()}
    }
    

    在这里插入图片描述
    从上面可看出计算属性的缓存性,对于一些复杂的逻辑操作,大量数据运算,如果我们同时写计算属性和方法,这个时候当由于某些需要,我们必须在不同的时间、不同的地方调用这个逻辑运算,然后获取运算结果时,情况如下:
    1.如果我们使用计算属性,那么只要响应式属性没发生改变,就会直接跳过计算过程,取上一次的缓存结果。
    2.而如果调用方法的话,即使响应式属性的值没发生变化,也会重新执行一遍此运算过程,会比较损耗性能。

    何时使用方法?何时使用计算属性?
    1.所以,对于函数体内运算过程较大,但是响应式数据不会发生改变的业务实现,我们应该使用计算属性以提高性能,
    2.如果你需要实时的最新数据,很明确不需要缓存或者你一定要传参。那么请使用方法,方法执行后时刻都是最新的数据(当然这会耗损一些性能)

    4)关于this
    1.在methods中,this指向的是vue实例对象。
    2.在computed中,this指向的也是vue实例对象。
    3.如果你把methods或者computed写成箭头函数,那么这个this将指向其当前所处上下文环境。一般vue实例都是写在全局的,即this指向window. 所以在vue实例中一般不要使用箭头函数。

    5)计算属性的完整写法
    1.每一个计算属性都包含一个getter和一个setter,我们刚才写的计算属性实际上只是利用了getter属性来读取,如下:
    在这里插入图片描述
    2.在我们需要时,我们也可以设置一个setter函数,当我们手动修改计算属性的值时就会触发setter函数,(这和c#的索引非常相似)
    在这里插入图片描述
    注意:
    虽然计算属性可以同时写getter和setter,但是在绝大多数情况下,我们只会用默认的getter方法来读取一个计算属性,在业务中很少使用到setter 。
    所以在声明一个计算属性时可以直接使用默认的写法,不必将getter和setter都声明。
    6)计算属性的依赖性
    1.计算属性可以依赖其他计算属性
    在这里插入图片描述
    2.计算属性不仅可以依赖当前vue实例的数据,还可以依赖其他实例的数据。
    在这里插入图片描述
    这在多人协作开发时比较有用,因为你写的组件所用到的数据,很可能会由他人组件进行提供。
    7)计算属性的用途
    1.常用于遍历大数据和做大量计算
    2.常用于动态的设置元素的样式名称class和内联样式style;【当class名称需要经过较为复杂的运算才能得到时】
    3.在组件中动态的传递props…

    (5)Filters 过滤器(文本转换器)

    1)概念
    在vue实例对象中添加一个filters选项,他和data同级。然后filters的作用就是实现过滤的效果,一般作用于{{ var }} 这里面的值。

    2)过滤器实例
    1.当实现过滤时,我们会在{{}}中要显示的表达式后面写一个管道符|来调用过滤处理方法。
    2.我们可以在过滤选项里面对日期进行格式化,也可以将0,1转换为真正的性别。

    在这里插入图片描述提示:上面判断v是否等于1,应该是==号,第二个month应该是表示名称写错了,应该是日

    3)过滤器可以串联
    所谓过滤器串联,也就是使用多个过滤器函数对同一个实例变量等按照先后顺序分别进行处理。
    实例:
    在这里插入图片描述
    4)调用过滤器时可以接收参数
    我们可以给过滤器传参,但是传递的参数会自动的从第二个位置开始,第一个默认就为要过滤的值。
    实例:
    在这里插入图片描述
    5)过滤器用途
    过滤器应当用于处理简单的文本转换,如果要实现更复杂的数据变换,应该使用计算属性。

    (6)Watch 监/侦听属性

    1)vue数据与视图的双向绑定
    我们已经知道,vue中数据与视图是双向绑定的,对于一个实例变量发生了变化,然后我们想要执行一些业务逻辑,然后来改变一些界面或者视图显示,这个是比较容易的,我们只要调用方法或计算属性就可以了,其中计算属性用的尤为的多。
    2)缺点
    但是,使用计算属性或者方法存在着一个缺点,那就是必须进行调用计算属性和方法,才能获取到相应的改变。
    那么某些时候我们并不想或者不能去显式调用方法与计算属性呢?此时该怎么办?
    3)新需求
    当某些实例变量发来变化后,我们就想去执行一个异步操作,比如向后端发起请求判断当前权限是否有效,获取后弹框提示下(这里就没有操作任何ui,没有和任何视图进行绑定,没有任何的显式调用)
    4)解决方式
    所以,当需要在数据变化时执行异步或开销较大的操作时,我们可以使用监听属性。
    这是vue实例的一个根选项,和data,methods,computed,filters同列
    5)实例如下
    在这里插入图片描述
    在这里插入图片描述
    6)监听属性的参数
    在监听属性中,我们可以传入两个参数,分别为监听的实例变量的新值和旧值。(请不要把顺序写错了,他们是对位传参)
    如下:

    data: {
    flag: 0,
    date: new Date(),
    },
    watch: {
    flag: function (newv, oldv) {
    alert("新值:" + newv + " 旧值:" + oldv);
    }
    },
    

    在这里插入图片描述

    展开全文
  • C++编程语言类对象的赋值与复制介绍(二)

    千次阅读 热门讨论 2018-08-20 20:33:21
    本系列文章主要介绍 C++ 编程语言中类对象的赋值操作、复制操作,以及两者之间的区别,另外还会介绍“深拷贝”与“浅拷贝”的相关知识。 本文为系列文章的第二篇,主要介绍 C++ 编程语言中类对象的复制的相关知识。...
  • 什么是面向对象

    万次阅读 多人点赞 2019-09-09 16:54:50
    从我们开始接触Java这门语言后,就有告诉我们这是一门面向对象的语言。说的最多的是new个对象,其实并不知道什么是对象。以为对象就是一个class(类),并不觉得有什么特殊。直到很久之后,面试官问到什么是OOP,...
  • 在初学者学Java的时候,面向对象很难让搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。 首先我们来简单的阐述面向对象的思想。 面向对象: 官方的语言很抽象,我们把官方的解释和定义...
  • JavaScript 进阶教程(1)--面向对象编程

    万次阅读 多人点赞 2020-08-16 18:13:37
    1 学习目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 ...当实物抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。 (2) 对象是一个.
  • Java引用对象

    万次阅读 2018-12-11 10:09:03
    这是显然的,但很容易被忘记,特别是在用引用队列(qv)追踪引用对象的时候。 同样要记住的是软引用、弱引用、虚引用只有在没有其他强引用指向引用者时才有意义,它们让你可以在对象通常会成为垃圾回收器的食物...
  • 实际开发,先按面向对象思想进行设计,具体实现时面向过程(习惯) 2)java 怎么支持面向对象呢? a. 万物皆对象,所有的类都是 Object 子类 b. java 中支持单继承,多重继承,Tiger 是 Animal 子类,Animal 是 ...
  • java面向对象

    万次阅读 多人点赞 2018-08-21 16:51:59
    包括面向对象概念、类与对象的关系、封装、构造函数、this关键字、static关键字、单例设计模式、继承、多态、内部类、异常、包等java基础知识。 1、面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是...
  • 关于面向对象的真面目

    千次阅读 2021-02-25 16:45:32
    这是因为当提到面向对象时,不少仍感觉“很难,难以对付”。 面向对象包含了各种技术,几乎涵盖了从 Java、Ruby 等编程语言到需求规格书和设计内容的图形表示、可重用的软件构件群、优秀设计的技术窍门、业务分析...
  • 对象存储

    千次阅读 2018-09-01 22:21:45
    对象存储到底是个什么鬼 对象存储到底是个什么鬼 小小河 2016-7-23   存储圈真会玩,块存储、文件存储、混合存储,今年又火了一个对象存储。银行,公安局,各大单位一言不合就换成对象存...
  • 什么是面向对象,以及什么是类和对象

    千次阅读 多人点赞 2019-08-11 19:04:04
    ​ 首先这两个种都是一种编程思维, 在一些简单的动作看来面向过程可能更加容易实现,它不用创建对象来进行实现,执行几步或一步完成。但是面对复杂动作面向对象来实现可能更加简单。二者之间做项目谁最简单不是绝对...
  • 开源对象存储MinIO技术白皮书

    万次阅读 多人点赞 2019-09-27 13:38:36
    MinIO创始者是Anand Babu Periasamy, Harshavardhana(戒日王)等, Anand是GlusterFS的初始开发者、Gluster公司的创始与CTO,Harshavardhana曾经是GlusterFS的开发人员,直到2011年红帽收购了Gluster公司。...
  • 深入理解Python中的面向对象

    万次阅读 多人点赞 2017-06-12 06:42:41
    面向过程与面向对象的对比 id、type和value的讲解 类和对象的概念 初始化构造函数__init__的作用 self关键字的使用 继承的概念 组合的概念 接口的概念 抽象类的概念 1、面向过程与面向对象的对比面向过程的程序设计...
  • javaScript中创建对象和Java创建对象的区别

    千次阅读 多人点赞 2018-03-27 09:26:52
    Java和js创建对象的区别
  • Java面向对象面试题总结

    万次阅读 多人点赞 2019-02-27 17:22:05
    答:(1)在类的定义中设置访问对象属性(数据成员)及方法(成员方法)的权限,限制本类对象及其他类的对象使用的范围。 (2)提供一个接口来描述其他对象的使用方法 (3)其他对象不能直接修改本对象所拥有的...
  • C#之 对象数组

    万次阅读 2019-05-30 11:01:48
    对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组就行了。 万物皆可对象,举个例子:一台电脑。我们就可以把电脑看成一个对象。 第一种: 常规的写法 string[] xxx = {} 例如...
  • Java什么叫面向对象

    万次阅读 多人点赞 2018-08-15 21:56:17
    什么是面向对象呢?...对象这个词你可以理解为一个总称,比如男人女人都叫,蜡烛皮鞭高跟鞋都是道具,所以面向对象原本的意思是“都叫对象”,翻译过来不是原汁原味了而已因此,房子是对象、飞机是对象...
  • 使用面向对象语言,离不开的就是对象,现在回过头来思考一下,真的了解所使用语言的对象么?我自己有点心虚,对于Java的对象,我了解的尚且还不够深入,对于一些底层的东西,还有待进一步了解学习。这一篇博文,来讲...
  • 1.对象概述 2.对象和属性 3.枚举一个对象的所有属性 4.创建新对象 4.1使用对象初始化器 4.2使用构造函数 4.3使用 Object.create 方法 4.4继承 4.5对象属性引用 4.5.1为对象类型定义属性 JavaScript的设计...
  • 对C++面向对象的编程的理解

    千次阅读 2019-01-16 18:05:06
    面向对象方法历经了30多年的研究和...长期以来,与计算机之间仍存在着较大的隔阂,认识问题时的认识空间和计算机处理问题时的方法空间的不一致,而面向对象技术有助于减小这一隔阂、并使这两个空间尽量趋于一致...
  • Java-面向对象编程-三大特性之多态

    万次阅读 多人点赞 2017-02-01 18:14:48
    我们前面已经介绍了面向对象编程的三大特性之二,今天就介绍最后一个特性-多态。 什么叫多态?从字面上理解就是多种形态,即对同一个客体,可以有多种不同的形式。就好像糖一样,有多种口味,你想吃什么口味的就...
  • JS对象中常见的操作方法

    千次阅读 2021-08-25 00:57:22
    本文内容:介绍对象的两种类型创建对象并添加属性访问对象属性删除对象属性作为函数参数枚举对象的属性数据类型检测Object常用的API一、JavaScript对象有两种类型Native:在E...
  • 阿里云的对象存储服务,oss 简介

    千次阅读 2021-10-22 13:50:19
    阿里云的对象存储服务,oss 简介 ...后来在写博客的时候,发现有用阿里云的oss 对象存储作为图床。 所以,这篇文章就整理一下有关 阿里云 对象存储 的知识点。 什么是对象存储OSS OSS的全称是:Object Storag
  • 避免在循环体中声明创建对象

    千次阅读 2017-11-17 09:24:56
    这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码:  Java代码  for (int i = 0; i  Object obj = new Object();  System.out.println("obj= " + obj);  }  上面的...
  • Object.keys(xxx).length==0 js判断对象是否为空对象的几种方法 1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) == "{}"); alert(b);//true 2...
  • 面向对象设计六大原则

    万次阅读 2019-04-09 23:23:45
    即“Program to an interface, not an implementation.” 优点:的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合的思维的...
  • 面向对象编程的思想

    万次阅读 热门讨论 2020-09-12 16:12:00
    面向对象思想 前言        计算机的革命起源于机器,所以说,编程语言的产生也是始于对机器的模仿。在19世纪的早期就已经出现过计算机的雏形。那时,人们为了构建导航所需的表格对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 722,823
精华内容 289,129
关键字:

容易被介绍对象的人