面向对象是一种编程思想,我们通过类(构造函数)和对象实现的面向对象编程,满足下述三个特定:封装、继承和多态。

封装

封装创建对象的函数

封装即把实现一个功能的代码封装到一个函数中,以后实现这个功能,只需要执行该函数即可。实现低耦合,高内聚。

现在我们把属性和方法封装成一个对象:

如果我们想创建一个不同性别不同姓名的对象,就需要再写一遍上述代码:

如果我们想要创建多个对象的话,写起来就非常麻烦,所以要去封装创建对象的函数解决代码重复的问题。

然后生成实例对象,就等于是在调用函数:

上述过程可以类比为开工厂生产酸奶:第一步:需要原料;第二步:加工酸奶;第三步:出厂售卖;我们通过var声明空对象的这一步就相当于第一步原料,添加属性和函数就相当于第二步加工,通过return返回对象就相当于第三步出厂。这种符合上述1、2、3步骤的函数叫做工厂函数,这种设计函数的思路,叫做工厂设计模式。

通过new调用函数

官方函数创建对象的方法是通过new的方法,当我们不使用new创建对象的时候,函数内部的this会指向窗口。

所以当我们在函数内部给this.name赋值为xxxx时,可以通过window.name输出xxxx,因为如果这个函数没有主人的话它的主人就是window对象。

但是如果这个函数通过new运算符去调用,那么这个函数中的this,就会指向新创建的对象。

当我们通过new运算符去调用函数的时候,它首部和尾部会自动的生成以下两步:1、原料操作:强制改变this指向this = new Object(); 3、出厂操作:将this返回return this;

所以现在我们改造一下之前创建的函数,调用的时候全部都通过new去调用,并且将函数中的person改成this。

构造函数

我们把这种可以创建对象的函数,叫做构造函数。(功能就是用来构造对象)

为了和别的函数,进行区分,我们把构造函数首字母大写。官方的构造函数:Array、Object、Date。

我们通过typeof可以看到官方通过new创建的Object、Array、Date本质上都是function函数。而且所有被该函数,创建的对象,对象的方法都是一套,arr1.push === arr2.push返回值是true。

但是通过调用函数生成的对象方法,彼此之间没有联系,不能反映出它们是同一个原型对象的实例。alert(p1.showName === p2.showName);返回值为false。

我们声明两个数组

给数组添加求和的函数

调用arr1.sum可以输出arr1的和为150,但是调用arr2.sum会系统报错,提示arr1.sum不是一个函数。因为arr1和arr2是单独的两个对象,给arr1添加一个方法,arr2并不会拥有这个方法。所以我们之前通过new调用函数生成对象后,他们的方法是相互独立的。

每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。

原型prototype

prototype对象的引入:所有实例对象需要共享的属性和方法,都放在这个对象中,那些不需要共享的属性和方法,就放在构造函数中。以此来模拟类。

所以想让arr2也拥有求和函数就需要再重新写一个arr2.sum,这样就会造成浪费,我们想让对象共用一个方法,这时候就需要引入原型prototype。在JS中一切皆对象,函数也是对象。 每一个被创建的函数,都有一个官方内置的属性,叫做prototype(原型)对象 ,我们输出一下show.protoype,得到结果[object Object]

所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。

如果,我们想要让该函数创建出来的对象,公用一套函数,那么我们应该将这套函数,添加该函数的prototype原型。 所以我们如果想让两个数组都拥有求和的方法,就需要将这个方法添加在Array的原型上。

现在arr1和arr2都可以使用这个函数,并且arr1.sum == arr2.sum,他们使用的这个函数都是原型上的同一个方法。

我们可以通过混合法,让用户自定义构造函数,封装一个可以创建对象的函数,并且调用的是同一个方法。

面向对象编程案例

现在我们要测试100辆不同品牌的汽车,记录他们在道路上行驶的性能指数。

创建一个可以构造各式各样车的构造函数

在Car的原型上添加功能:让车跑在路上,计算时速。

1. Car.prototype.run = function(road){2. alert(`一辆${this.type}品牌的${this.name}系列,时速为${this.speed}km/h的车,跑在长度为${road.length}km的${road.name},最终的成绩是${road.length / this.speed}小时`);3. }

创建一个可以构造各式各样马路的构造函数

添加第一个测试用例car1:

1. var kuahaidaqiao = new Road("跨海大桥

没有run窗口_学会了面向对象,还怕没有对象?相关推荐

  1. 没有run窗口_使用 Terminator 在一个窗口中运行多个终端 | Linux 中国

    Terminator 为在单窗口中运行多个 GNOME 终端提供了一个选择,让你可以灵活地调整工作空间来适应你的需求.-- Sandra Henry-stocker Terminator 为在单窗口中 ...

  2. 笨办法学python47 原理_41:学会说面向对象

    # 练习41.学会说面向对象 在这个练习中,我要教你如何说"面向对象",我要给你一些你需要知道定义的词.然后我会给你一组你必须了解的句子,最后我会给你一大堆练习,你必须完成这练习题 ...

  3. cmd代码表白_学会这些(滑动关机、应用多开、QQ微信消息攻击、表白神器),逼格瞬间提升1000倍...

    Hi-新朋友,记得点蓝字关注我哟 // 时隔多天,今天又和大家见面了.上期分享的关于计算窗口的一些基本操作,你可以点击<关于Windows窗口的这些骚操作,Are you know?>查看 ...

  4. 易语言系列————————窗口_枚举所有子窗口(精易模块)

    在易语言开发中,有时想直接从一个窗口中拿取 窗口下所有控件的信息,可以用window知道的api入手,但是精益模块有带有这个功能哦. 窗口_枚举所有子窗口() 三个参数: 一.欲寻找控件的窗口句柄 二 ...

  5. 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)

    最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_) 一.08.qt中的坐标系 二,09 信号和槽-点击按钮关闭窗口_ 来自 一.08.qt中的坐标系 二,09 信号 ...

  6. python实现微信抢红包神器_快过年啦,还怕手速慢,我用Python自动抢红包!

    原标题:快过年啦,还怕手速慢,我用Python自动抢红包! 马上快过年啦,在春节的时间里,最少不了的就是大家在微信群里热热闹闹的发几个微信红包,图的就是一个喜庆. 今天,小编就带领大家用Python来 ...

  7. IDEA 解决maven插件运行Run窗口不自动弹出

    问题一:有时候在项目里面点几右侧maven插件的clear或别的操作,直接没反应???什么鬼,然后去Run Configurations添加个maven脚本又能正常运行. 清空前置操作就好了!!! 问 ...

  8. 小醜发布伤感QQ日志_失去你,我还剩下什么

    小醜发布伤感QQ日志_失去你,我还剩下什么 - 小醜发布伤感QQ日志_失去你,我还剩下什么 一个人躺在了无声音的屋子里 过着狼狈不堪的生活 亲爱的 我想你了 我知道你想对我狠心 这一次QQ空间日志 我 ...

  9. C语言小学生都能学会,你还说单片机很难,难道你连小学生都不如吗

    C语言小学生都能学会,你还说单片机很难,难道你连小学生都不如吗 我是很认真的,没有在跟你吹水,前段时间有邻居知道我是攻城狮,闲聊的时候想让我带他的女儿学习单片机,当时我就拒绝了,因为在我的认知范围里这 ...

最新文章

  1. ASP.NET MVC+Bootstrap个人博客之打造清新分页Helper(三)
  2. Java小结(三)——打印完美杨辉三角
  3. gsonformat安装怎么使用_IDEA中使用GsonFormat
  4. springboot整合redis操作缓存(将查询到的数据放在缓存中)
  5. allegropcb怎么导出成cad_私藏技巧分享!CAD中的表格坐标快速输出成Excel!
  6. 纽约时代广场广告费才7千元每天,花钱装逼值不值?
  7. [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]
  8. invoke 按钮点击_h5+ app内点击按钮实现复制功能 实现方法
  9. python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析
  10. 【VS开发】VS2010中导入ActiveX控件
  11. Dede系统oday漏洞临时修补方法
  12. 支付交易相关接口文档对接
  13. 零数开放许可链入选《互联网周刊》2021区块链应用创新TOP50
  14. AXD 调试经验,使用及问题
  15. 关于linux的filp->private_data解释
  16. 小白学习MySQL - 一次慢SQL的定位
  17. rust怎么发送求救信号_海上遇险怎么发求救信号?
  18. Jmeter性能测试简单示例
  19. Bootstrap data类型的Url格式--url(data:image/gif;base64,AAAA):把小数据直接嵌入到Url中
  20. 常见测试用例设计之水杯

热门文章

  1. sap采购订单更改记录_SAP系统如何实现减税:增值税16%
  2. html轮播视频插件上加文字,可加入视频、图片的轮播swiper插件(可以拖动、视频存在加载条)...
  3. PHP中strtotime函数有范围吗,PHP中使用strtotime函数注意事项
  4. c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...
  5. 【java基础】zip压缩文件
  6. hibernate 三种状态的转换
  7. 我的Git使用-资料查询,名博笔记
  8. python xml.dom模块解析xml
  9. 运维从业人员是否需要考证?
  10. ibatis使用心得——返回Map的Map