美文网首页理论知识JavaScript
24:JS 原型链,原型链的顶端是什么?Object 的原型是什

24:JS 原型链,原型链的顶端是什么?Object 的原型是什

作者: 小小前端搬运工 | 来源:发表于2022-05-31 22:06 被阅读0次

能够把这个讲清楚弄明白是一件很困难的事,

首先明白原型是什么,在 ES6 之前,JS 没有类和继承的概念,JS 是通过原型来实现继承的,在 JS 中一个构造函数默认带有一个 prototype 属性,这个的属性值是一个对象,同时这个 prototype 对象自带有一个 constructor 属性,这个属性指向这个构造函数,同时每一个实例都会有一个proto属性指向这个 prototype 对象,我们可以把这个叫做隐式原型,我们在使用一个实例的方法的时候,会先检查这个实例中是否有这个方法,没有的话就会检查这个 prototype 对象是否有这个方法,基于这个规则,如果让原型对象指向另一个类型的实例,即

constructor1.protoytpe=instance2,这时候如果试图引用 constructor1 构造的实例 instance1 的某个属性 p1,

首先会在 instance1 内部属性中找一遍,

接着会在 instance1.proto(constructor1.prototype)即是 instance2 中寻找 p1

搜寻轨迹:instance1 -> instance2 -> constructor2.prototype……->Object.prototype;这即是原型链,原型链顶端是 Object.prototype

补充学习:

每个函数都有一个 prototype 属性,这个属性指向了一个对象,这个对象正是调用该函数而创建的实例的原型,那么什么是原型呢,可以这样理解,每一个 JavaScript 对象在创建的时候就会预制管理另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型继承属性,如图:

prototype01.jpg

那么怎么表示实例与实例原型的关系呢,这时候就要用到第二个属性 proto

这是每一个 JS 对象都会有的一个属性,指向这个对象的原型,如图:

prototype02.jpg

既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢,指向实例是没有的,因为一个构造函数可以生成多个实例,但是原型有属性可以直接指向构造函数,通过 constructor 即可

接下来讲解实例和原型的关系:

当读取实例的属性时,如果找不到,就会查找与对象相关的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层,那么原型的原型是什么呢,首先,原型也是一个对象,既然是对象,我们就可以通过构造函数的方式创建它,所以原型对象就是通过 Object 构造函数生成的,如图:

prototype03.jpg

那么 Object.prototype 的原型呢,我们可以打印 console.log(Object.prototype.proto === null),返回 true

null 表示没有对象,即该处不应有值,所以 Object.prototype 没有原型,如图:

prototype04.jpg

图中这条蓝色的线即是原型链,

最后补充三点:

constructor:

function Person(){

}

var person = new Person();

console.log(Person === person.constructor);

原本 person 中没有 constructor 属性,当不能读取到 constructor 属性时,会从 person 的原型中读取,所以指向构造函数 Person

proto

绝大部分浏览器支持这个非标准的方法访问原型,然而它并不存在与 Person.prototype 中,实际上它来自 Object.prototype,当使用 obj.proto时,可以理解为返回来

Object.getPrototype(obj)

继承:

前面说到,每个对象都会从原型继承属性,但是引用《你不知道的 JS》中的话,继承意味着复制操作,然而 JS 默认不会复制对象的属性,相反,JS 只是在两个对象之间创建一个关联,这样子一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,叫委托更合适。

相关文章

  • 24:JS 原型链,原型链的顶端是什么?Object 的原型是什

    能够把这个讲清楚弄明白是一件很困难的事, 首先明白原型是什么,在 ES6 之前,JS 没有类和继承的概念,JS 是...

  • javascript中prototype、__proto__、O

    Object.prototype只是一个普通对象,它是js原型链的最顶端。 Object.prototype只是一...

  • 廖雪峰JS小记

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

  • 构造函数

    1 函数有原型属性 prototype 对象(除原型链顶端的Object外)拥有proto属性proto的标准...

  • JS的__proto__和prototype

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

  • js中的原型链

    原型链的本质是链表 原型链上的节点是各种原型对象,比如Function.prototype Object.prot...

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

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

  • JS构造函数原型与实例的思考

    在JS中,所有对象都是 Object 的实例,Object是原型链的源头 a是A的实例,可以访问A原型上的方法 c...

  • 2022前端高频面试题

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

  • 面试题【Day06】

    本篇绪论 1,原型、原型链 1,原型、原型链 创建对象的几种方法: 1,字面量 2, 构造函数 3, Object...

网友评论

    本文标题:24:JS 原型链,原型链的顶端是什么?Object 的原型是什

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