当前位置: 首页 > news >正文

面试题之---解释一下原型和原型链

  • 实例化对象

    1. 和普调函数一样,只不过调用的时候要和new连用(实例化),不然就是一个普通函数调用
    2. function Person () {}
      const o1 = new Person()   //能得到一个空对象
      const o2 = Person()   //什么也得不到,这就是普通的函数调用
  • 原型

原型就是一个为对象实例定义了一些公共属性和公共方法的对象模板。
  • 函数原型--prototype

        每一个函数天生自带一个成员,叫做prototype,是一个对象空间。

        在函数的prototype里面存储的内容,不是给函数使用的,是给函数的每一个实例化对象使用的。

  • 对象原型__proto__

        每一个对象天生自带一个成员,叫做__proto__,是一个对象空间。

        这个__proto__对象空间是给每一个对象使用的。

function Person () {}
const o1 = new Person()
console.log(o1.__proto__ === Person.prototype) //true

        实例化对象的__proto__和所属的构造函数的prototype是一个对象空间

function Person(name) {  this.name = name;  
}  Person.prototype.sayHello = function() {  console.log(`Hello, my name is ${this.name}`);  
};  const person1 = new Person('Alice');  
person1.sayHello(); // Output: Hello, my name is Alice

        在这个例子中,person1 对象通过 __proto__ 属性访问 Person.prototype,从而可以调用 sayHello 方法。

  • constructor

        实例化对象的__proto__里面也有一个成员叫做constructor。

        这个属性就是指向当前这个对象所属的构造函数。

function Person () {}
const o1 = new Person()
console.log(o1.constructor === Person) //true
  • 原型链

  1. 对象之间的继承关系通过构造函数的prototype指向父类对象,直到指向Object对象为止形成的指向链条。
  2. 通俗讲: 原型链是原型对象创建过程的历史记录。
  3. 注:在javascript中,所有的对象都拥有一个__proto__属性指向该对象的原型(prototype)

  • 当一个对象我们不知道准确的是谁构造的时候,我们就把它看成object的实例化对象
  • 也就是说,我们的构造函数的prototype的__proto__指向的是object.prototype

  • 那么object.prototype也是一个对象,我们有一句话叫万物皆对象,所以object.prototype就到顶了,object.prototype的__proto__就是null

  • 查找顺序:当你访问某个属性时,JavaScript 采用以下顺序查找:

    • 看对象本身是否有这个属性。
    • 如果没有,查看该对象的 __proto__ 是否有这个属性。
    • 如果还没有,继续查找 __proto__.__proto__,依此类推,直到查到 Object.prototype。如果在整个原型链中都未找到,返回 undefined
  • 原型关系图

http://www.lryc.cn/news/481895.html

相关文章:

  • 【Leecode】Leecode刷题之路第46天之全排列
  • 自动驾驶革命:从特斯拉到百度,谁将主宰未来交通?
  • Python __str__()方法
  • 虚拟机的安装
  • HCIP快速生成树 RSTP
  • Python基础学习-05元组 tuple
  • vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
  • c++基础28函数的类型
  • Elasticsearch(四):query_string查询介绍
  • 超好用shell脚本NuShell mac安装
  • Vue禁止打开控制台/前端禁止打开控制台方法/禁用F12/禁用右键
  • volatile关键字
  • [Linux] 共享内存
  • 网络的基础
  • 金融学期末速成笔记
  • 【Elasticsearch入门到落地】1、初识Elasticsearch
  • 电子版产品册代替纸质版产品册,开源节流!
  • npm i忽略依赖冲突
  • 商品,订单业务流程梳理一
  • Spring中的 bean 标签中的 factory-bean , factory-method
  • 车间管理|基于SprinBoot+vue工厂车间管理系统设计与实现(源码+数据库+文档)
  • C#实战:使用腾讯云识别服务轻松提取火车票信息
  • 王珊数据库系统概论第六版PDF+第五版课后答案+课件
  • Spring学习笔记(四)
  • CALL处 F8的“bug“
  • Verilog中的有符号数与无符号数
  • 15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!
  • 前端代码分析题(选择题、分析题)——this指向、原型链分析
  • react 组件应用
  • mysql 快速解决死锁方式