在了解javaScript的原型链之前,我们得先来看一下原型是什么。

在javaScript中,所有的函数都会有着一个特别属性:prototype(显示原型属性);当我们运行如下代码时:

function Fn(){

}

在内存中则是如下这样工作的:

我们可以看到,当function对象创建时,其会有一个属性:prototype,该属性在定义函数的时候被自动赋值,值默认为:{},即:指向堆空间中的空的object对象,而该object空对象即是此function的原型对象

在函数实例化对象时,所有的实例化对象也会有一个特别的属性:__proto__(隐式原型属性),继续刚才的例子,我们运行如下代码:

function Fn(){

}

var fn=new Fn();

此时内存中是如下状况:

此时有没有发现function对象的显示原型属性与其实例化得到的对象的隐式原型属性的值是相同的,即它们指向同一个对象——空object(function的原型对象)。

下面我们来说下显示原型属性与隐式原型属性的关系。

在function实例化对象时,在其实例化对象内部相当于自动运行了如下代码:

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

我们可以通过如下代码来判断显示原型属性与隐式原型属性是否相等:

function Fn(){

}

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

console.log(fn.__proto__===Fn.prototype);

运行上述代码会输出:true,这说明显示原型属性与隐式原型属性确实相等。

由此我们可以总结:函数实例化对象的隐式原型属性等于其构造函数的显示原型属性


了解过原型之后,我们来看一下原型链。

先来看一张图:

那么这个空的object对象是不是一个实例化对象呢,如果是的话,它的构造函数又是谁呢?

在回答上述问题之前我们先来看一个新的属性:constructor;

这个属性与prototype作用类似,不过不同的是:prototype是function对象指向它对应的原型对象,而constructor则是原型对象指向其对应的function对象

举个例子:

function Fn(){

}

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

console.log(fn.__proto__.constructor);

若我们运行上述代码,则会得到如下结果:

通过这个例子我们可以知道:Fn的实例化对象fn可以通过fn.__proto__.constructor来得到自身的构造函数。

它的原理也很简单,由前面我们可以知道,fn.__proto__===Fn.prototype是成立的,所以可以通过fn.__ptoto__来得到Fn的原型对象,然后再使用constructor来得到与该原型相对应的function函数,即:Fn。

再回到前面的问题上,我们同样可以通过上述方法来获得object的构造函数。

即执行:

function Fn(){

}

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

console.log(Fn.prototype.__proto__.constructor);

其输出结果如下:

我们可以看到,object空对象的构造函数是Object

那么问题又来了,我们知道:函数实例化对象的隐式原型属性等于其构造函数的显示原型属性

这个object空对象的构造函数既然是Object,那么object应该也通过__ptoto__来指向一个原型对象。

即:

那么Object函数原型对象的隐式原型又指向谁呢?

我们来看一下:

function Fn(){

}

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

console.log("输出结果为:"+Fn.prototype.__proto__.__proto__);

由此可以知道:Object函数原型对象的隐式原型不再指向其他对象,即:

当我们运行如下代码时:

function Fn(){

}

var fn=new Fn();  //fn内部:this.__ptoto__=Fn.prototype

Object.prototype.name='mmzkyl';

console.log("输出结果为:"+fn.name);

会得到如下输出:

我们可以很明显看到,上述代码并没有在Fn内部定义任何东西,但是fn.name确实又输出了:mmzkyl。

这里来解释一下,当查找对象内部属性的属性/方法时,JavaScript引擎会自动沿着如下图所示来进行查找:

JavaScript会先在自身查找目标属性/方法,若是没有查找到则会沿着其隐式原型属性渠道原型对象中寻找,若是找到了则返回该值,若是还没有找到,则继续沿着隐式原型属性寻找,若是一直找到了Object函数原型对象还是没有找到,则会返回undefined。

这个寻找的过程类似与一条链,而这也称为原型链

javaScript(原型链)的更多相关文章

  1. JavaScript学习总结(十七)——Javascript原型链的原理

    一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...

  2. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...

  3. 明白JavaScript原型链和JavaScrip继承

    原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: <script type="text/javascript"&g ...

  4. Javascript 原型链资料收集

    Javascript 原型链资料收集 先收集,后理解. 理解JavaScript的原型链和继承 https://blog.oyanglul.us/javascript/understand-proto ...

  5. 资料--JavaScript原型链

    JavaScript原型链 原文出处:https://www.cnblogs.com/chengzp/p/prototype.html 目录 创建对象有几种方法 原型.构造函数.实例.原型链 inst ...

  6. JavaScript原型链:prototype与__proto__

    title: 'JavaScript原型链:prototype与__proto__' toc: false date: 2018-09-04 11:16:54 主要看了这一篇,讲解的很清晰,最主要的一 ...

  7. JavaScript原型链及其污染

    JavaScript原型链及其污染 一.什么是原型链? 1.JavaScript中,我们如果要define一个类,需要以define"构造函数"的方式来define: functi ...

  8. 图解Javascript原型链

    本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关 ...

  9. 画一画javascript原型链

    在javascript中,几种数据类型String,Number,Boolean,Object,Function都是函数,可称之为函数对象. 可以说拥有prototype属性的都是函数. 所有对象都拥 ...

  10. JavaScript原型链和instanceof运算符的暧昧关系

    时间回到两个月前,简单地理了理原型链.prototype以及__proto__之间的乱七八糟的关系,同时也简单了解了下typeof和instanceof两个运算符,但是,anyway,试试以下两题: ...

随机推荐

  1. java在指定区间内生成随机数

    Random对象生成随机数 首先需要导入包含Random的包 import java.util.Random; nextInt(int)方法将生成0~参数之间的随机整数但不包括参数. 例如生成0~99 ...

  2. Python封装应用程序的最佳项目结构是什么?

    Python封装应用程序的最佳项目结构是什么? 转载来源于stackoverflow:https://stackoverflow.com/questions/193161/what-is-the-be ...

  3. 整整 Java 线程池

    为什么用线程池 用官方文档来说,线程池解决了两个问题: 一是在执行大量的异步任务时,因为线程池减少了任务开始前的准备工作,如频繁创建线程,启动线程等工作,提升了性能表现:二是提供了一种绑定资源和管理资 ...

  4. Spring IOC 之注册解析的 BeanDefinition

    2019独角兽企业重金招聘Python工程师标准>>> DefaultBeanDefinitionDocumentReader.processBeanDefinition() 完成 ...

  5. Python-四则运算-蔡晓晴,杜婷萱

    github链接:https://github.com/Amy-CC/Arithmetic-Operation 一.需求 1.使用-n 参数控制生成题目的个数 2.使用-r 参数控制题目中数值(自然数 ...

  6. H3C配置Web登陆

    为什么80%的码农都做不了架构师?>>>   1.开启http服务. [H3C]ip http enable 2.创建web登陆的用户. [H3C]local-user king / ...

  7. 带权并查集--hdu3047 ZJnu stadium

    题意:给出一个n,m,n表示的是有n 个人,m表示的是 有m 对关系: 接下来输入的就是这m对关系,a,b,x:表示的是a,b相距x个距离:然后判断输入的是否与这个数的上面的数信息一致, 输出不一致的 ...

  8. VUE 后台管理系统权限控制

    谈一谈VUE 后台管理系统权限控制 前端权限从本质上来讲, 就是控制视图层的展示,比如说是某个页面或者某个按钮,后端权限可以控制某个用户是否能够查询数据, 是否能够修改数据等操作,后端权限大部分是基于 ...

  9. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

  10. Shell脚本(五)函数

    总结下shell中的函数用法 #!/bin/bash function add_v1() { echo "call function add" } function add_v2( ...