这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

原型和原型链

1. 原型

每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法

1.1 __proto__

对象__proto__属性值就是对象的原型对象

此属性是过时的语法,现在建议使用Object.getPrototypeof(obj)

函数也是对象,因此也有__proto__属性

1.2 Prototype

函数的prototype属性值就是函数的原型对象

定义:给其他对象提供共享属性的对象,prototype 本身也是对象,只是被用以承担某个职能

当说 prototype 对象时,实际上说的是 “xxx 函数对象的 prototype 对象”

1.3 constructor

每个原型都有一个 constructor 属性指向关联的构造函数

实例访问 constructor 属性是获取的原型对象的构造函数

function Person(age) {
this.age = age;
}
let p = new Person(50);
console.log(Person.prototype.constructor === Person); // true
console.log(p.constructor === Person); // true 会查找原型对象

对于引用类型来说 constructor 属性值是可以修改的,但是对于基本类型来说是只读的,因为创建他们的是只读的原生构造函数(native constructors

2. 原型链

每个对象拥有一个原型对象,通过 __proto__ 指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。这种关系被称为原型链 (prototype chain),通过原型链一个对象会拥有定义在其他对象中的属性和方法。

因此,当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

2.1 原型链知识点

  • 原型链的尽头(root)是Object.prototype所有对象(除null)均从Object.prototype继承属性

  • Object.prototype.__proto__值是null,原型链终止

  • Function.prototypeFunction.__proto__为同一对象

    意味着: Object/Array/String等等构造函数本质上和Function一样,均继承于Function.prototype

  • Function.prototype直接继承root(Object.prototype

  • 继承的原型链:Object.prototype(root)<---Function.prototype<---Function|Object|Array...

  • 对象的__proto__指向自己构造函数的prototype

  • ES规范定义对象字面量({})的原型就是Object.prototype

2.2 ObjectFunction的鸡和蛋的问题

  • Function.prototype是个不同于一般函数(对象)的函数(对象)

    • Function.prototype像普通函数一样可以调用,但总是返回undefined
    • 普通函数实际上是Function的实例,即普通函数继承于Function.prototypefunc.__proto__ === Function.prototype
    • Function.prototype继承于Object.prototype,并且没有prototype这个属性。func.prototype是普通对象,Function.prototype.prototypenull
    • 总结Function.prototype其实是个另类的函数,可以独立于/先于Function产生。
  • Object本身是个(构造)函数,是Function的实例,即Object.__proto__就是Function.prototype

问题总结:

先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,Function和Object和其它构造函数继承Function.prototype而产生

2.3 原型链图解

原型和原型链经典关系图

自己画的原型图

图解描述:

Person、Object、Function是函数对象,具备prototype属性,其他对象是只有__proro__

获取原型对象

Person.__proto__及Object.__proto__与Function.__proto__相等,是ƒ () { [native code] }

Person.__proto__及Object.__proto__与Function.__proto__的原型对象为Object.prototype

Function.__proto__和Function.prototype值相等,为空函数: ƒ () { [native code] }

Person.constructor、Object.constructor与Function值相等,为: ƒ Function() { [native code] }

原型链代码输出结果

function Person(name) {
this.name = name
}
var p2 = new Person('king');
console.log(p2.__proto__) //Person.prototype
console.log(p2.__proto__.__proto__) //Object.prototype
console.log(p2.__proto__.__proto__.__proto__) // null
console.log(p2.__proto__.__proto__.__proto__.__proto__)
//null后面没有了,报错
console.log(p2.__proto__.__proto__.__proto__.__proto__.__proto__)
//null后面没有了,报错
console.log(p2.constructor)//Person
console.log(p2.prototype)//undefined p2是实例,没有prototype属性 console.log(Person.constructor)//Function 一个空函数
console.log(Person.prototype)
//打印出Person.prototype这个对象里所有的方法和属性
console.log(Person.prototype.constructor)//Person
console.log(Person.prototype.__proto__)// Object.prototype
console.log(Person.__proto__) //Function.prototype
console.log(Function.prototype.__proto__)//Object.prototype
console.log(Function.__proto__)//Function.prototype
console.log(Object.__proto__)//Function.prototype
console.log(Object.prototype.__proto__)//null console.log(Function); // ƒ Function() { [native code] } 空函数,名为Function
console.log(Object.constructor); // ƒ Function() { [native code] }
console.log(Person.constructor); // ƒ Function() { [native code] }
console.log(Function === Object.constructor); // true
console.log(Function === Person.constructor); // true console.log(Function.__proto__); // ƒ () { [native code] }
console.log(Function.prototype); // ƒ () { [native code] }
console.log(Function.__proto__ == Function.prototype); // true
console.log(Function.__proto__.__proto__ === Object.prototype) // true
console.log(Function.prototype.__proto__ === Object.prototype) // true

本文转载于:

https://juejin.cn/post/7086376102238617614

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--JavaScript原型和原型链复习笔记的更多相关文章

  1. JavaScript原型(链)学习笔记

    javascript是基于原型的一门脚本语言,那究竟原型是什么? 本文将从以下几个方面重点阐述原型 构造函数是什么? 构造函数和我们常见的Array String有什么关系? 原型的使用? __pro ...

  2. 原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)

    首先,js的数据结构有 原始类型(5种):Boolean.Number.String.Null.Underfined, 然后是引用类型:Array.Date.Error.RegExp.Function ...

  3. <深入理解JavaScript>学习笔记(5)_强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. (prototypal :原型.学好英语还是很重要的) 虽然这经常被当作是 JavaScript 的缺点 ...

  4. javaScript 原型与原型链学习笔记

    javaScript中,原型是常用到一种方式,它能降低储存占用,写出更高效的代码 原型常用到的则是prototype属性 JavaScript prototype 属性 定义和用法 prototype ...

  5. JavaScript原型与原型链学习笔记

    一.什么是原型?原型是一个对象,其他对象可以通过它实现属性继承.简单的说就是任何一个对象都可以成为原型 prototype属性: 我们创建的每个函数都有一个prototype属性,这个属性是一个指针, ...

  6. 再起航,我的学习笔记之JavaScript设计模式09(原型模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

  7. javascript进阶-《原型对象和原型链》

    原创发布 by @一像素 2015.12 在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象Object 和 函数对象Function. 一般而言,通过new Fun ...

  8. javascript原型与原型链个人理解

    想了解原型和原型链,我觉得首先我们得知道javascript里有一个Object 与 Function,它俩都是构造函数,当然函数也是一个对象.我们打印Object 与 Function看一下, co ...

  9. JavaScript 类型、原型与继承学习笔记

    目录 一.概览 二.数据类型 1. JavaScript中的数据类型 2. 什么是基本类型(Primitive Data Type) 2.1 概念 2.2 七个基本类型 2.3 基本类型封装对象 3. ...

  10. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

随机推荐

  1. win10 通过 ssh 连接云服务器失败 are too open. bad permissions.

    最近突然想起了自己的学生机服务器,买来了吃灰很久了,拿出来捣鼓捣鼓 以前服务器装的 windows server,这次把它重装成了 CentOS 8.0,然后按官网步连接步骤骤一步一步尝试. 腾讯云官 ...

  2. linux 中grep 命令详细使用方法说明

    前言在linux命令行中,经常需要对当前获取的一堆数据进行过滤.提取和分析,其中grep命令是其中非常重要的命令之一,比如,在生产环境服务器上,经常使用到下面这个命令 ps -ef | grep ja ...

  3. Oracle本地管理对比数据字典管理表空间

    Locally vs. Dictionary Managed Tablespaces 整理自:http://www.orafaq.com/node/3. When Oracleallocates sp ...

  4. Python中 r'', b'', u'', f'' 的含义

    python中 r'', b'', u'', f'' 的含义   r/R:非转义的原始字符串 与普通字符相比,其他相对特殊的字符,其中可能包含转义字符,即那些,反斜杠加上对应字母,表示对应的特殊含义的 ...

  5. 运用 Argo Workflows 协调 CI/CD 流水线

    Argo Workflows 是一个开源的容器原生工作流引擎,用于协调 CI/CD 在 Kubernetes 中的运作.它以 Kubernetes 自定义资源(CRD)的形式实现,使开发人员能够创建自 ...

  6. 解决Spring boot 单元测试,无法读取配置文件问题。

    1.启动类上加上@EnableConfigurationProperties 2.springboot版本springboot 2.X版本在单元测试中读取不到yml配置文件的值这是个大坑,在项目中写单 ...

  7. sql题目---day39

    # 1.查询所有的课程的名称以及对应的任课老师姓名 #where select teacher.tname,course.cname from teacher,course where course. ...

  8. vue upload 图片转base64、转二进制数组,保存编码数据到文件

    功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...

  9. 【Azure 事件中心】EventHub 中同一条消息不停的推送给消费端问题记录

    问题描述 EventHub 中同一条消息,不停的推送给消费端,查看日志发现错误: Caused by: com.azure.messaging.eventhubs.implementation.Par ...

  10. C++特殊类的设计与单例模式

    #pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用拷贝构造函数以及赋值运算 ...