美文网首页
js 中的原型链

js 中的原型链

作者: 施主画个猿 | 来源:发表于2018-01-12 11:33 被阅读0次

先看一下什么是原型链

function Foo(){}
Foo.prototype.num = 3;
// new Foo( ) 将返回一个对象 把这个对象赋值给了 bar 
var bar = new Foo();
// bar 是怎么找到的原型下面的num呢?
alert(bar.num); //3  

bar并没有num 属性,它是怎么拿到3的呢 此处的 bar 就是通过原型链找到了值
原型链
JavaScript中的对象有一个特殊的 __proto__ 内置属性,其实此属性就是对于它的原型对象的引用(关联)。
当我们使用 function关键字声明一个函数时,系统会自动创建一个对象,访问这个对象可以通过 函数名.prototype 访问(我们一般把这个对象叫做原型对象)。
当使用 new 关键字调用函数时(这时我们一般把这个函数称为构造函数,关于使用new关键字执行的具体过程请阅读js 中的new(https://www.jianshu.com/p/9544f92572be))其中有一个步骤就是通过new关键字对function关键字什么函数时创建的对象进行原型关联,关联到声明函数时创建的那个对象(函数名.prototype指向的那个对象)

上面例子 中使用 new 关键字调用 Foo()函数时会创建一个对象我们把这个对象赋值给了 bar ; bar对象内部的.__proto__属性会关联到声明函数时创建的那个原型对象 , bar.num属性在bar中无法找到时,就会访问bar.__proto__查找,这个过程会持续到找到匹配的属性名或者查找完整条prototype链(所有普通的[[Prototype]]链最终都会指向内置的Object.prototype)
,因此上面例子的原型链是这样的

bar.__proto__ -- 指向 --> Foo.prototype --然后(Foo.prototype.__proto__) -- 指向 --> Object.prototype

使用图表示


image.png

并且每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针( __proto__ )。
那么,假如我们让原型对象等于另一个类型的实例,结果会怎么样呢?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓原型链的基本概念
对prototype更详细的介绍请看这里(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype)

补充:

      function People(name) {
        this.name = name;
        this.sayName = function() {
          console.log('my name is:' + this.name);
        }
      }

      People.prototype.walk = function() {
        console.log(this.name + 'is walking');
      }

      var p1 = new People('饥人谷');
      var p2 = new People('前端');
2404178-70684ddd20c13efb.png

以下三点需要谨记

1.每个对象都具有一个名为_proto_的属性;

2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的属性,指向一个对象

3.每个对象的_proto_属性指向自身构造函数的prototype 指向的对象;

image.png
https://segmentfault.com/a/1190000011880268

相关文章

  • 在nodejs中面向对象:Bearcat

    JS中的面向对象 最最最开始,我们先来说说JS中的面向对象。 原型链 参考文章:图解Javascript原型链 J...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS闭包问题(一)

    之前我写过一篇JavaScript原型与原型链的文章,此属于JS中的重难点。 而闭包,是JS中除了原型链之外又一个...

  • javascript中的原型链与继承

    javascript中的原型链与继承javascipt中的原型链和继承机制是这门语言所特有的,但js中的原型机制也...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • JavaScript原型对象与原型链

    一、前言 原型和原型链是 JavaScript中不可避免需要碰到的知识点,在刚开始学习 JS 时,原型和原型链都是...

  • 原型和原型链的简单理解

    原型 在JS中原型就是prototype对象,用来表示类型之间的关系。 原型链 JS中对象和对象之间是有联系的,通...

  • 原型与新版的类-class

    首先来理解原型原型 === 共用属性可以先看看方姐的几篇文章:什么是JS原型链JS 中 proto 和 proto...

网友评论

      本文标题:js 中的原型链

      本文链接:https://www.haomeiwen.com/subject/vzzxoxtx.html