先画上一个关系图:

1. 什么是prototype、__proto__、constructor?

var arr = new Array;

1. __proto__是原型属性,对象特有的属性,是对象指向另外一个对象(就是第二点的原型对象),一般是实例对象的属性,如arr.__proto__

2. prototype是原型对象,构造函数特有的属性,是构造函数指向的对象,如Array.prototype

  其中:

arr.__proto__ === Array.prototype; //true

3. constructor是原型对象用于指回构造函数的属性,是对象指向函数的,如Array.prototype.constructor

2. 他们的作用?

1. 原型属性__proto__的作用是为了实例对象能够使用构造函数继承下来的属性和方法。通俗点说就是

  当前对象找不到的属性会去通过__proto__去构造函数的原型对象找,直到找到null。这就是原型链!

2. 原型对象prototype是构造函数特有的属性(原型对象也是对象!),是为了让构造函数所实例化的对象们可以找到公用的属性和方法。

  可以想象prototype是用来存放:爸爸(构造函数)给儿子们(实例对象们)留下的家产,

  儿子们都可以通过__proto__(想象成钥匙)访问到prototype(存放家产的箱子),从而使用从爸爸那继承的属性和方法

3. constructor就像是原型对象prototype的身份证,可以找到构造函数,这是prototype特有的。

3. 他们之间一些复杂的关系:

1.  arr.constructor === Array;

  实例对象arr本身并没有constructor属性,这是原型对象特有的属性嘛

  但是arr可以访问到他爸爸(构造函数)的原型对象呀!通过__proto__就可以访问到了Array.prototype了呀

  所以 arr.constructor 实际上是 arr.__proto__.constructor

2. 刚刚说了__proto__是对象指向另外一个原型对象,而函数实际上就是对象,所以构造函数也会有__proto__(这个在图上没有写)

Array.__proto__ === Function.prototype; //true
console.log(Array.__proto__);//ƒ () { [native code] }

 注意:函数的__proto__一律都指向Function.prototype,即构造函数都默认为Function的儿子,而Function的__proto__也是指向自己的prototype

Function.__proto__ === Function.prototype;// true

参考文章:https://blog.csdn.net/cc18868876837/article/details/81211729

JavaScript的原型对象prototype、原型属性__proto__、原型链和constructor的更多相关文章

  1. JavaScript 的原型对象 Prototype

    在 JavaScript 中,每当定义一个对象(或函数)时候,对象中都会包含一些预定义的属性,其中一个属性就是原型对象 prototype. var myObject = function( name ...

  2. [js高手之路]原型对象(prototype)与原型链相关属性与方法详解

    一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...

  3. js高级——构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器

    一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别 ...

  4. 构造函数、原型对象prototype、实例、隐式原型__proto__的理解

    (欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原 ...

  5. 原型对象prototype和原型属性[[Prototype]]

    构造器:可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器,他们有各自的实现方式. 比 ...

  6. [js高手之路]使用原型对象(prototype)需要注意的地方

    我们先来一个简单的构造函数+原型对象的小程序 function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAg ...

  7. JS中构造函数与原型对象的同名属性,实例会取哪一个

    构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性 ...

  8. 【原型模式】--重写原型对象prototype的影响

    //[原型模式]--重写原型对象prototype的影响 2014-12-12//定义构造函数function Person() { }//直接指定构造函数的原型为一个对象(为了简化逐个给原型添加成员 ...

  9. JavaScript 深入了解对象中的属性

    本篇主要介绍JS中对象的属性,包括:属性的分类.访问方式.检测属性.遍历属性以及属性特性等内容. 目录 1. 介绍:描述属性的命名方式.查找路径以及分类 2. 属性的访问方式:介绍'.'访问方式.'[ ...

随机推荐

  1. Vue路由History模式分析

    Vue路由History模式分析 Vue-router是Vue的核心组件,主要是作为Vue的路由管理器,Vue-router默认hash模式,通过引入Vue-router对象模块时配置mode属性可以 ...

  2. 搭建单机版的kafka

    搭建单机版的kafka  

  3. 为了省钱,我用1天时间把PHP学了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你在通往架构师的路上吗? 程序员这个行业就像是在不断的打怪升级,突破每一阶段的瓶颈期 ...

  4. js获取foreach循环选中的值

    一,循环出来的值,通过checked选中,获取到value值 二,定义一个空数组,用push将数据保存在数组里面 以上操作便可以进行虎丘选中的值了

  5. ConcurrentHashMap源码解析,多线程扩容

    前面一篇已经介绍过了 HashMap 的源码: HashMap源码解析.jdk7和8之后的区别.相关问题分析 HashMap并不是线程安全的,他就一个普通的容器,没有做相关的同步处理,因此线程不安全主 ...

  6. 《Android逆向反编译代码注入》 - 逆向安全入门必看视频教程

      适合人群: Android开发人员.逆向反编译开发人员.以及对Android逆向安全感兴趣的朋友. 视频地址: 51CTO学院:https://edu.51cto.com/course/24485 ...

  7. 1-JAVA类、接口、抽象、多态

    类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...

  8. MeteoInfoLab脚本示例:线性拟合

    MeteoInfoLab提供一个线性拟合函数linregress,参数是参与拟合的两个数据序列,返回拟合的斜率.截距和相关系数.有了上述拟合参数可以用polyval函数生成拟合数据(直线).然后可以将 ...

  9. pytest文档52-命令行参数--setup-show查看fixture的执行过程

    前言 使用命令行运行 pytest 用例的时候,看不到 fixture 的执行过程. 如果我们想知道fixture的执行过程和先后顺序,可以加上 --setup-show 命令行参数,帮助查看 fix ...

  10. super函数

    Python面向对象中super用法与MRO机制:https://www.cnblogs.com/chenhuabin/p/10058594.html python 中 super函数的使用:http ...