何为原型链呢

就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个链式结构.称为原型链。

这里又扯到了另外两个概念了。

实例对象>>> 先往下看实例对象

原型对象>>> 先往下看 原型对象

实例对象

说到这里。我们另外再来提一提 另一个东西: 构造函数。那既然提到了构造函数 由不得不提普通函数了。

先来讲一下构造函数

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值。

例如:

let Num = function Num() {
this.add = function (a, b) {
return a + b
}
} let n = new Num()
console.log(n.add(1, 2));

这里实例对象已经出来了。就是在你new 这个 构造函数的时候。就已经创建了实例对象 在本文中 n就是一个实例对象

**这里简单说一下实例对象在创建成功时会发生什么变化。

  1. 在内存中创建一个新的空对象;
  2. 让this指向这个新的对象。这里this指向问题 我只用一句话就能总结: 谁调用this就指向谁
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法;
  4. 返回这个新对象(所以构造函数里面不需要return)。

再来讲一下普通函数

普通函数就是.... 就是最普通的函数 例如

function add(a, b) { return a+b };
add(1,2)

虽然上述两种方式。都能得到结果 3

但是两种声明以及使用的方式都不一样。


那这里总结下区别

  1. 构造函数首字母要大写,类似于python中的类
  2. 构造函数是通过new操作符来创建实例对象的,而普通函数则不需要。

这里还有个点。

实例对象创建成功后 已经有了一个__proto__的内置属性了。

而构造函数本身有个属性是prototype 称之为对象原型

原型对象

原型对象是构造函数上的一个属性,用来创建公共的方法。也就是prototype

举个例子。

直接创建个构造函数。然后赋值个方法。

//语法: 构造函数.prototype.方法名 = function() {}
function Animal(name) {
this.name = name
} // 赋值公共方法
Animal.prototype.eat = function () {
console.log(`${this.name}在吃饭`)
} let dog = new Animal("狗")
let cat = new Animal("猫")
dog.eat()
cat.eat()
console.log(dog.eat === cat.eat) // true

结果

狗在吃饭
猫在吃饭
true

这里扯到了 原型对象 那就再讲讲另一个概念 对象原型。其实这个概念可以忽略不计。

对象原型

**对象原型是实例对象(对象)身上的一个属性, 该属性为 _proto_ **

//语法: 构造函数.prototype.方法名 = function() {}
function Animal(name) {
this.name = name
} // 赋值公共方法
Animal.prototype.eat = function () {
console.log(`${this.name}在吃饭`)
} let dog = new Animal("狗"); console.log(dog.__proto__);
console.log(dog.__proto__ === Animal.prototype);

结果

{ eat: [Function (anonymous)] }
true

短暂总结一下

这里捋一下关系

  1. 每个构造函数都有一个原型对象 原型对象的(prototype)
  2. __proto__等于其构造函数的prototype,即每个__proto__都指向其构造函数的prototype
  3. 原型对象(prototype) == 对象原型(__proto__)

constructor

construct是原型对象(prototype) 和 对象原型(__proto__)身上的一个属性

而 constructor会记录当前对象属于哪个构造函数。

这里举个例子吧、

//语法: 构造函数.prototype.方法名 = function() {}
function Animal(name) {
this.name = name
} // 赋值公共方法
Animal.prototype.eat = function () {
console.log(`${this.name}在吃饭`)
} let dog = new Animal("狗"); dog.constructor.prototype
console.log(dog.constructor.prototype)

结果 这里在node中看不出来。我们直接看浏览器中的

这里就很好理解了。

其实 constructor 的出现原本就是用来进行对象类型判断。任何对象都有constructor属性。

那你说这个有啥用???

因为我们是搞爬虫的吗。肯定是很有用的。

constructor 本来就是用来找到其上层构造函数的。那我们在设置补环境框架。或者是在补环境的时候不就能容易找到最外层的构造环境了吗?

原型链

很好现在基础概念都懂了。那我们是不是可以重新梳理了一下呢?

我的理解是原型链的构成包含了上文我讲的的这些部分。

所谓原型链的流程(仅本人在补环境中的理解):

当你在寻找一个方法或者属性。如果该对象自身没有这个属性 或者方法。

那这个引擎(JS)就会沿着原型链向上去找。直到找到这个属性 或者方法。

直到到达原型链的最顶层也就是我们上文说的Prototype

那话说到这里。

说白了 原型链其实就是JavaScript中用于实现对象继承的一种机制。

好了 此文完结。懂各种概念就行

浅析JS原型链的更多相关文章

  1. JS原型链

    JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...

  2. 深入分析JS原型链以及为什么不能在原型链上使用对象

    在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...

  3. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

  4. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  5. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  6. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  7. 一张图看懂 JS 原型链

    JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...

  8. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  9. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  10. 02 js原型链

    1 js原型链是一个绕不开的话题.直接上说吧. /** * 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同. */ const util = require('util ...

随机推荐

  1. StretchDIBits在一些图像尺寸下失败

    StretchDIBits用来打印图像,但是由于某种未知的原因,当图像达到特定尺寸时,它会失败. 图像数据从其他一些图像源以24位BGR格式加载到无符号int数组中.它可以在某些大小下工作,但根本无法 ...

  2. win32-Transparent的使用

    这个api的功能主要是实现"透明" 原理: Transparent将hdc中bmp的特定颜色"透明化" #include <Windows.h> # ...

  3. PostgreSQL中查看版本的几种方式

    PostgreSQL中查看版本的几种方式 1.SQL方式 1 2 3 4 5 6 7 8 9 10 postgres=# show server_version;  server_version -- ...

  4. Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

    前言   前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试. ...

  5. windows下redis安装与使用

    下载 redis下载地址 步骤,一直下一步按就完事了,记得勾选添加到环境配置 其中建议自定义路径吧,文件夹名字Redis,一定要大写,小写不来事. 安装完后 启动命令 找到你安装redis的文件夹,在 ...

  6. 解读平台工程,DevOps真的死了吗?不,它只是换了个马甲而已,弥补了DevOps空心理论,让DevOps继续发展壮大

    最**台工程这个概念越来越火爆,Gartner 的预测,到 2026 年,80% 的软件工程组织将拥有*台工程团队,来提供内部服务.组件和应用程序交付工具,作为可重复使用的资源.本篇文章将带你走进*台 ...

  7. Google Test Adapter安装

    背景 我有一个vs2015 的gtest 工程,编译完成后,需要gtest adapter帮我把测试列表显示出来,但是通过vs自带的工具或者网页下载安装遇到2个问题: 1.下载速度超级慢,慢到我能到火 ...

  8. Java实现DES加密解密

    DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥 加密原理: DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产 ...

  9. FROM_UNIXTIME函数格式化时间戳日期类型

    select FROM_UNIXTIME(bce.daysec_time/1000,'%Y-%m-%d %h:%i:%s') ,bce.* from biz_cvent bce where bce.d ...

  10. Unity3D之OnTriggerEnter和OnCollisionEnter

    OnCollisionEnter方法要求碰撞的发起方必须拥有刚体,而被碰撞方有没有刚体并不重要; OnTriggerEnter方法则对此没有要求,只需要碰撞双方有一个具有刚体即可触发,当有物体勾选is ...