1、构造函数

a、什么是构造函数?
解释:通过关键字new 创建的函数叫做构造函数
作用:用来创建一个对象

废话少说直接上代码,首先我们还是创建一个构造函数人类

然后我们在创建两个实例,一个凡尘 一个吴彦祖!毕竟只有我们2个人的颜值可以进行匹配

我们可以看到凡尘和彦祖都有一个属性name和一个方法eat;那么我们简单思考一下,因为凡尘和彦祖都是通过构造函数new Person创建出来的,那么他们俩个的eat方法是否相等?

打印结果是false.为什么会是false? 这个时候就不得不说一个经典的面试题了!!!

当创建构造函数的时候js执行了哪些操作?
1、在内存中开辟了一块空间
2、把this指向了当前对象

通过这个面试题就可想而知为什么不相等了,地址的指向都不相同了还指望他们相同吗?如果还不理解我们还可以举一个通俗易懂的栗子,假设你和隔壁老王都有一个孩子,你们有一个公共的方法“教育孩子”,你可以想象一个你和隔壁老王的孩子都不在一起,俩的教育方法名字虽然相同,但是你能指望老王教育出来的孩子和你教育出来的孩子能够一模一样?别天真了孩子,要是都一样的话那么这个世界上就没有忠孝礼义廉了

那么问题来了我们如何才能让他们两个的方法都相等呢?也就是说如何才能让他们都调用同一个方法,毕竟每次都调用不同的方法多么浪费内存!!!!

那么我们可不可以这样将这个方法写在对象外面让他们调用的这个方法地址执行外面的这个函数?

貌似可以!!!但是如果要是有多个方法的时候该怎么办?难到我需要在外面定义多个全局函数吗?毕竟我们主张的是尽量减小全局变量和全局函数,第一是为了防止变量名的冲突。第二也是为了初学者的词汇量着想 第三也是为了防止变量的污染

难到就没有什么完美的解决方案吗?
那下面就不得不说下我们伟大的原型prototype

2、原型prototype

  1、什么是prototype?
    a、prototype是每一个函数自带的一个属性
    b、prototype属性指向一个对象,简称原型。所有prototype称为原型

  2、原型有什么作用?
    1、节约内存

    2、扩展属性和方法

    3、可以实现类的继承

  3、接下来我们创建2个函数,来查看函数里面是否有prototype这个属性

从以上例子中我们可以更加肯定每一个函数都有一个prototype属性而这个属性指向一个object。如果prototype指向一个对象的话那么我们自然就可以给它添加属性和方法了

4、如何在prototype原型上面添加属性和方法?

5、因为这个方法是在构造函数Person的原型上添加的,因此当每次实例化一个对象的时候,每个对象都有这样一个方法,而且都是调用的同一个方法

6、那么接下来我们看下我们加在原型上面的这个方法在这个实例化对象的哪里放着。

我们可以清晰的看到我们实例化出来的对象,这个eat方法在__proto__里面放着,而这个__proto__同样也指向了一个对象。那么我们就不得不思考下构造函数的prototype与实例化对象里面的__proto__是否是同一个东西

7、构造函数的prototype与实例化__proto__之间的关系

不比较不知道,一比较吓一跳。他们不仅发现里面的东西相同,而且判断结果也相同。而且你会发现你通过原型prototype添加的方法在__proto__里面也会出现。换句话说也就是__proto__可以访问prototype里面的所有属性和方法

3、prototype--->__proto__---->实例化对象三者之间的关系

1、prototype总结

解释:每一个函数都有一个prototype这个属性,而这个属性指向一个对象,我们简称原型

作用:
1、节约内存

2、扩展属性和方法

3、可以实现类之间的继承

2、__proto__总结
1、每一个对象都有一个__proto__属性

2、 __proto__指向创建自己的那个构造函数的原型

3、对象可以直接访问自己__proto__里面的属性和方法

3、constructor总结
constructor指向创建自己的那个构造函数

接下来我们说说三者之间的关系。

当我们创建一个构造函数的时候这个构造函数自带了一个prototype属性,而这个属性指向一个对象,也就是原型对象。这个原型对象里面有一个constructor构造器,它的作用是指向创建自己的构造函数。除此之外prototype还可以存放公共的属性和方法。当我们实例化一个对象的时候,这个对象自带了一个__proto__属性,这个__proto__指向创建自己的构造函数的原型对象。可以使用这个原型对象里面的属性和方法。那么接下来我们用一个栗子和内存图来表示

面向对象---prototype、__proto__、实例化对象三者之间的关系的更多相关文章

  1. 【面向对象】----【prototype&&__proto__&&实例化对象三者之间的关系】(四)-----【巷子】

    1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...

  2. 【面向对象】【prototype&&__proto__&&实例化对象三者之间的关系】

    1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...

  3. 5.Javascript 原型链之原型对象、实例和构造函数三者之间的关系

    前言:用了这么久js,对于它的原型链一直有种模糊的不确切感,很不爽,隧解析之. 本文主要解决的问题有以下三个: (1)constructor 和 prototype 以及实例之间啥关系? (2)pro ...

  4. Javascript 原型链之原型对象、实例和构造函数三者之间的关系

    前言:用了这么久js,对于它的原型链一直有种模糊的不确切感,很不爽,隧解析之. 本文主要解决的问题有以下三个: (1)constructor 和 prototype 以及实例之间啥关系? (2)pro ...

  5. 转:spring data jpa、 hibernate、 jpa 三者之间的关系

    原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...

  6. 程序中try、throw、catch三者之间的关系

    c++程序中,采用一种专门的结构化处理逻辑的异常处理机制. 1.try语句 try语句块的作用是启动异常处理机制,检测try语句块中程序语句执行时可能出现的异常. try语句块总是与catch一同出现 ...

  7. js中数据、内存、变量的概念及三者之间的关系

    目录 数据.内存.变量的概念及三者之间的关系 什么是数据 数据的特点 什么是内存 栈内存 堆内存 JS引擎如何管理内存 什么是变量 变量是普通类型时 变量是引用类型时 数据.内存.变量的三者之间的关系 ...

  8. silverlight Canvas、StackPanel、Grid三者之间的关系

    学习 silverlight   首先Canvas.StackPanel.Grid 博客园里看到jailu的这篇文章整理得很好 贴下来: Silverlight提供了非常灵活的布局管理系统,让程序员和 ...

  9. 电脑结构和CPU、内存、硬盘三者之间的关系

    前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑的: 键盘鼠标.显示器.机箱.音响等等. 这里显示器为比较老的CRT显示器 ...

随机推荐

  1. 前端笔记之React(三)使用动态样式表&antd&React脚手架&props实战

    一.使用动态样式表 1.1 LESS使用 全局安装Less npm install -g less 创建1.less文件,然后可以用lessc命令来编译这个文件: lessc 1.less 1.css ...

  2. python小方法 随笔记

    1. 元组和列表的接收 s1,s2 = [,] print(s1,s2) # 执行结果: 1 2 s3,s4 = (,) print(s3,s4)# 执行结果: 3 4 2. 变量值的交换 a = b ...

  3. [apue] 使用 poll 检测管道断开

    一般使用 poll 检测 socket 或标准输入时,只要指定 POLLIN 标志位,就可以检测是否有数据到达,或者连接断开: ]; fds[].fd = STDIN_FILENO; fds[].ev ...

  4. vboxnetctl: no such file or directory

     sudo /Library/StartupItems/VirtualBox/VirtualBox restart sudo /Library/StartupItems/VirtualBox/Vir ...

  5. guava cache大量的WARN日志的问题分析

    一.问题显现 2019-04-21 11:16:32 [http-nio-4081-exec-2] WARN com.google.common.cache.LocalCache - Exceptio ...

  6. 浅谈 JavaScript 中 Array 类型的方法使用

    前言:Array 类型是 JavaScript 中除了 Object 类型以外最常用的类型. 一.创建数组 JavaScript 中的数组与其他语言中的数组有着很大的区别.例如Java.PHP等语言中 ...

  7. redis RDB 和AOF

    参考文献 Redis源码学习-AOF数据持久化原理分析(0) Redis源码学习-AOF数据持久化原理分析(1) Redis · 特性分析 · AOF Rewrite 分析 深入剖析 redis AO ...

  8. 如何取得Spring管理的bean

    本文主要讲3中实现方式,请用第3种方法(通用) 1.servlet方式加载时配置如下 <servlet> <servlet-name>springMVC</servlet ...

  9. 阿里云体验:安装jdk

    在阿里云的linux服务器上默认是没有安装java环境的,需要自己安装.查了许多资料,发现这篇文章简洁易用.http://www.cnblogs.com/cloudwind/archive/2012/ ...

  10. cogs.12运输问题2题解

    乍一看貌似和运输问题1没有任何区别,但本题有一个有意思的东西叫做下限,我个人称之为非强制下限,因为本题中要求的实际是我走这条边这条边才至少走下限的流,虽然出题人没说,但从样例来看确实是这样的,而强制下 ...