美文网首页
原型与原型链

原型与原型链

作者: 海山城 | 来源:发表于2017-12-01 14:42 被阅读0次

原型

function Person(name, age){
  this.name = name
  this.age  = age
}

Person.prototype.printName = function(){
  console.log(this.name)
}

var p1 = new Person('hsc', 25)
p1.printName()
原型图
  • 通过函数定义了类Person,类(函数)自动获得属性prototype(原型)
  • 每个类的实例都会有一个内部属性__proto__,指向类的prototype属性
  • 实例调用方法(p1.printName()),会先去自身找,找不到,会自动去__proto__中找,也就是原型上去找,原型相当于一个公共的容器,存放一些共用的代码等,可以减少内存的浪费

原型链

知道了原型,那么原型链又是什么呢?有什么用呢?先来看个例子

var mycars=new Array(1,2,3)
mycars.valueOf() //[1, 2, 3]

这个valueOf方法哪里来的?
首先实例本身没有这个方法,接着去原型mycars.__proto__找,也就是Array.prototype上找,发现也没有这个方法,但是mycars.__proto__里面也有个__proto__,发现valueOf方法在这个里面,如下图


寻找valueOf方法
  • 首先原型Array.prototype也是一个对象,它也是由函数构造出来的。所以它的__proto__指向了构造它的函数的原型。
  • mycars.__proto__.__proto__.constructor为Object可以知道,构造Array的原型mycars.__proto__(即Array.prototype)的函数就是Object。
    其实任何类的prototype属性本质上都是个类Object的实例,所以prototype也和其它实例一样也有个proto内部属性,指向其类型Object的prototype
  • valueOf方法就在Object的原型上

总结一下: valueOf方法的寻找过程。
①首先在实例mycars本身去寻找
②没有的话,去构造这个实例的函数Array的原型prototype(即Array.prototype)上去寻找
③仍然没找到的话,去构造Array.prototype的函数Object的原型prototype (即Object.prototype)上去寻找
④就这样一级一级的往上找。最终在Array.prototype.__proto__上找到了,即在mycars.__proto__.__proto__
⑤总的来说就是 实例.__proto__.__proto__....... 这样的一条链上找下去,这条链就是原型链
可能说的有点抽象,结合下面的原型链的图来理解

原型链图

补充

  • instanceof的作用是判断一个对象是不是一个函数的实例(比如obj instanceof fn)。实际上就是判断这个函数的prototype是不是在这个对象的原型链上,即obj.__proto__ === fn.prototype;obj.__proto__.__proto__ === fn.prototype;obj.__proto__....__proto__ === fn.prototype,只要有一个成立即可
  • 三句话可以解释一切关于原型方面的问题(参考自原型,原型链,Function,Object的理解强烈推荐看看里面的题目):
    ①当new一个函数的时候会创建一个对象,【函数.prototype === 被创建对象.__proto__】
    ②函数也是一个对象,一切函数都是由Function这个函数创建的,所以【一切函数.__proto__ === Function.prototype】
    ③一切函数的原型对象都是由Object这个函数创建的,所以【一切函数.prototype.__proto__ === Object.prototype】(Object.prototype除外,☆☆☆☆☆Object.prototype.__proto__ === null☆☆☆☆☆)

最后附上一张自己的手绘图


image

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • 2019-01-28

    原型与原型链

  • 廖雪峰JS小记

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

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

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

  • JavaScript 面向对象第一篇

    1.原型链 ---- (实例对象与原型之间的连接 叫做原型链) 2. hasOwnproperty ----(看是...

  • 原型与原型链以及继承

    今天复习下原型与原型链的知识,以及记录新学的继承知识点。 知识点纲要 原型与原型链 es5与es6继承 什么是原型...

  • JavaScript深入理解this关键字(一)

    摘要 最近在公司需要做培训,我打算把JavaScript中的原型与原型链讲给大家。但我在梳理原型与原型链的时候发现...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • 原型链&instanceof关键字

    1.原型链&instanceof关键字 简单说明 原型链 与 instanceof 作用原理 1.原型链 1...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

网友评论

      本文标题:原型与原型链

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