美文网首页
js 原型链

js 原型链

作者: 小李不小 | 来源:发表于2021-08-09 16:34 被阅读0次

首先,我们先来看一张图:


image.png

一、 什么是原型链?

        每个对象都可以有一个原型_proto_,这个原型还可以有它自己的原型,以此类推,形成一个原型链。查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去,如果还是没有的话再去向原型对象的原型对象里去寻找...... 这个操作被委托在整个原型链上,这个就是我们说的原型链了。

二、原型指针

们知道了原型的概念,接下来我们就照着上面的图来具体分析一下原型的指针;中间最上面蓝色模块标注的构造函数Foo, 里面有两个属性: proto 和 prototype, 这两个很容易使人混淆,先说说prototype:

prototype:

prototype属性,它是函数所独有的,它是从一个函数指向一个对象。它的含义是函数的原型对象,也就是这个函数(其实所有函数都可以作为构造函数)所创建的实例的原型对象; 这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)

proto:

__proto__ 是原型链查询中实际用到的,它总是指向 prototype,换句话说就是指向构造函数的原型对象,它是**对象独有的。**注意,为什么Foo构造也有这个属性呢,因为再js的宇宙里万物皆对象,包括函数;

根据以上的概括我们能知道Foo构造函数proto指向的是他的构造函数的原型对象,它的构造函数是Function, 也就是说Foo的proto指向Function.prototype, 我们再看到左边绿色的a和b函数的proto指像的是Foo.prototype,因为他们是通过 new Foo实例化出来的,它们的构造函数就是Foo(), 即a.proto = Foo.prototype; 接着我们来看看最右边紫色的模块Function.prororype, 它的proto指针指向的是Object.prototype,Object.proto又为null.。于是我们就可以得出:在原型链中的指向是,函数 → 构造行数 → Function.prototype → Object.protype → null ;

constructor:

我们看到途中最中间灰色模块有一个constructor属性,这个又是做什么用的呢?

每个函数都有一个原型对象,该原型对象有一个constructor属性,指向创建对象的函数本身。

此外,我们还可以使用constructor属性,所有的实例对象都可以访问constructor属性,constructor属性是创建实例对象的函数的引用。我们可以使用constructor属性验证实例的原型类型(与操作符instanceof非常类似)。

由于constructor属性仅仅是原始构造函数的引用,因此我们可以使用该属性创建新的对象,如:
image
通过第一个对象实例化对象的constuctor方法创建第2个实例化对象,说明创建的新对象ninja2 是Ninja的实例,由于ninja和ninja2不是同一个对象可以得出它们是两个截然不同的实例;

结论:

    1、__proto__ 是原型链查询中实际用到的,它总是指向 prototype;

    2、prototype 是函数所独有的**,**在定义构造函数时自动创建,它总是被 __proto__ 所指。

所有对象都有proto属性,函数这个特殊对象除了具有proto属性,还有特有的原型属性prototype。prototype对象默认有两个属性,constructor属性和proto属性。prototype属性可以给函数和对象添加可共享(继承)的方法、属性,而proto是查找某函数或对象的原型链方式。constructor,这个属性包含了一个指针,指回原构造函数。

作者:super_wei
链接:https://www.jianshu.com/p/08c07a953fa0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • 廖雪峰JS小记

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

  • JS的__proto__和prototype

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

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

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

  • 从实现角度分析js原型链

    从实现角度分析js原型链 欢迎来我的博客阅读:《从实现角度分析js原型链》 网上介绍原型链的优质文章已经有很多了,...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

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

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

  • 2022前端高频面试题

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

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

  • web前端面试之js继承与原型链(码动未来)

    web前端面试之js继承与原型链(码动未来) 3.2.1、JavaScript原型,原型链 ? 有什么特点? 每个...

网友评论

      本文标题:js 原型链

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