大厂面经 - 聊聊经常被面试官问到的原型链

1. 前言

无意看到了之前整理的高频面试笔记 ,发现很多都有点陌生了,之后我有时间会陆续把一些比较重要的前端知识更新出来

尤其是现在就业环境不太好的情况下,一方面自己复习巩固下防患于未然,一方面也给小伙伴们的面试助一把力啦

这期依旧是之前整理的高频面试笔记中的题目

2. 普通函数和构造函数有什么区别

这一直是我新手期比较困惑的问题,网上说这个的版本很多,但是都没有让我印象深刻。直到最近翻之前的笔记,好像豁然开朗啦~~~

构造函数是函数的其中一种用法 ,它们的用途不同

js 复制代码
function test(){}
function Test(){}
let a = new Test()
console.log(test, Test, a)

大家可以看下上图

其实两者的明显区别只有两个

  • 用法:被new了之后的是构造函数(构造函数的命名规范是首字母大写)

  • this指向:

    • 构造函数中this指向新创建的对象实例

    • 普通函数中this指向取决于函数的调用方式

构造函数

js 复制代码
function Person(name, age) {
  // 实例属性
  this.age = age;

  // 实例方法
  this.sayHello = function() {
    console.log(111);
  };
}

// 创建对象实例 
const person1 = new Person('Alice', 30);

// 调用实例方法
person1.sayHello();

普通函数

js 复制代码
// 普通函数
function greet(name) {
  console.log(`Hello, ${name}!`);
}

// 调用普通函数
greet('Alice'); // 输出:Hello, Alice!

3. prototype

每个函数都有一个prototype

js 复制代码
function Person() {
}
// prototype是函数才会有的属性
Person.prototype.name = 'cluonote';
var person1 = new Person();
console.log(person1)

这里,Person 就是⼀个构造函数,我们使⽤ new 创建了⼀个实例对象 person1

那这个函数的prototype 指向的是什么呢?

通俗的说:new 构造函数生成实例的时候,把该构造函数的prototype放到了实例的原型上

通俗的说:该函数的 prototype指向的是实例的原型,也就是person1的原型Person.prototype(不是person1.prototype,见下图 ),也就是person1.__protoo__见下文

那什么是原型呢?

每个对象(null除外)在创建的时候就会与之关联另⼀个对象,这个对象就是我们所说的原型,每⼀个对象都会从原型"继承"属性。

4. __proto__

那么该怎么表示实例与实例原型,也就是 person 和 Person. prototype 之间的关系呢?

使用__proto__来表示

这是每⼀个对象(除了 null )都具有的⼀个属性,叫 __proto__ ,这个属性会指向该对象的原型。

js 复制代码
function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true

5. constructor

既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢

上面这句话划重点了,有点对知识体系承上启下的意思

指向实例没有 ,因为⼀个构造函数可以⽣成多个实例,但是原型指向构造函数是有的constructor ,每个原型都有⼀个 constructor 属性指向关联的构造函数

js 复制代码
function Person() {
}
console.log(Person === Person.prototype.constructor); // true

6. 原型链

当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性 ,如果还查不到,就去找原型的原型,⼀直找到最顶层为⽌。

js 复制代码
function Person() {
    this.age = '18'
}
// prototype是函数才会有的属性
Person.prototype.age = '8';
var person1 = new Person();
console.log(person1)

我们要是找age 的值,首先会到person1.age(18),假如找不到,会找person1.__proto__.age(8),假如还找不到,会找Person.prototype.__proto__.age,假如还找不到,会找Object.prototype.__proto__.age

找到Object.prototype.__proto__会发现是null,就会停止查找了,这是最顶层

person1.__proto__ 等于 Person.prototype

Person.prototype.__proto__ 等于 Object.prototype

如下图,蓝色的就是原型链

7. 面试

7.1 说说原型链是什么吧

原型链里面涉及到以下几个知识点:构造函数、prototype__proto__constructor和向上溯源

  • 每个函数都有一个prototype

  • 构造函数的原型 指向该构造函数的实例对象的原型 ,反过来也OK,构造函数的实例的原型 等于该构造函数的原型

js 复制代码
function Person() { } 
var person = new Person(); 
console.log(person.__proto__ === Person.prototype); // true
  • 礼尚往来 ,构造函数和实例对象都可以指向原型,那么原型的constructor 指向哪里呢?指向其构造函数

  • 而原型链:就是找实例对象的属性 ,如果找不到就去找实例对象的原型 里找,再找不到,就去找原型的原型,⼀直找到最顶层为⽌。

  • 原型链的顶层Object.prototype.__proto__,为null

7.2 类的实例对象的__proto__ === 类的原型吗

等于的

js 复制代码
console.log(person.__proto__ === Person.prototype); // true

7.3 类本身 === 类的原型的构造函数吗

等于的

js 复制代码
function Person() { } 
console.log(Person === Person.prototype.constructor); // true

参考资料:

JavaScript深入之从原型到原型链

9. 总结

原型链算是一个内功心法,工作中常有用到。

其实搞清楚其几个核心概念:构造函数、prototype__proto__constructor和向上溯源,基本就算拿下了

这篇文章我尽力把我的笔记和想法放到这了,希望对小伙伴有帮助。

欢迎转载,但请注明来源。

最后,希望小伙伴们给我个免费的点赞,祝大家心想事成,平安喜乐。

相关推荐
光影少年7 分钟前
前端 AIGC
前端·aigc
启山智软17 分钟前
供应链商城核心功能模块清单
java·前端·开源
徐同保21 分钟前
Claude Code提示词案例(开发复杂动态路由详情页面)
前端
Σdoughty25 分钟前
python第三次作业
开发语言·前端·python
是萧萧吖25 分钟前
每日一练——有效的括号
java·开发语言·javascript
gpldock22230 分钟前
Flutter App Templates Deconstructed: A 2025 Architectural Review
开发语言·javascript·flutter·wordpress
白中白1213841 分钟前
Vue系列-2
前端·javascript·vue.js
jin4213521 小时前
React Native鸿蒙跨平台完成闪屏页作为移动应用的入口级页面,实现的二手置换应用闪屏页SecondhandSplash
javascript·react native·react.js·ecmascript·harmonyos
CHU7290351 小时前
一番赏盲盒小程序前端功能:层级乐趣与便捷服务的双向赋能
前端·小程序
共享家95271 小时前
基于 Coze 工作流搭建历史主题图片生成器
前端·人工智能·js