prototype和proto的区别

devtools/2025/3/16 16:46:56/

在 JavaScript 中,prototype__proto__ 都与原型链和继承机制有关,但它们的含义和作用是不同的。下面来详细讲解它们的区别。


一、prototype 和 proto 的区别

特性prototype__proto__
作用构造函数的原型对象实例对象的隐式原型
类型对象对象
访问方式构造函数.prototype实例对象.proto
作用场景为构造函数定义方法和属性用于实例对象访问原型链
修改影响修改后影响所有实例修改后仅影响该实例及其后代

二、prototype 和 proto 的详细解析

1. prototype 的作用

  • 每个构造函数都有一个名为 prototype 的属性,它指向一个对象
  • 这个对象是用来共享方法和属性的。
  • 当通过构造函数创建对象时,实例会继承 prototype 上的方法和属性

示例:

// 构造函数
function Person(name) {this.name = name;
}// 给构造函数的 prototype 添加方法
Person.prototype.sayHello = function() {console.log("Hello, my name is " + this.name);
};// 创建实例
const person1 = new Person("Alice");
const person2 = new Person("Bob");person1.sayHello(); // 输出:Hello, my name is Alice
person2.sayHello(); // 输出:Hello, my name is Bob
注意:
  • 通过修改 Person.prototype所有实例都能访问到新的方法或属性。
  • prototype 只有在构造函数上存在,实例本身没有 prototype 属性

2. proto 的作用

  • 每个对象实例都有一个 __proto__ 属性,指向创建该实例的构造函数的原型对象
  • 这个属性是隐式原型,用于查找属性和方法

示例:

console.log(person1.__proto__ === Person.prototype); // true
console.log(person2.__proto__ === Person.prototype); // true
作用:
  • 当我们访问对象的属性或方法时,JavaScript 会先查找对象本身,如果没有,则沿着**__proto__** 继续查找,直到 null
  • 这种链式查找机制称为原型链

三、构造函数、实例、原型三者关系

  1. 构造函数:

    • Person.prototype:原型对象。
    • Person.prototype.constructor:指向构造函数本身。
  2. 实例对象:

    • person1.__proto__:指向构造函数的原型对象,即 Person.prototype

关系图:

Person --> prototype --> { sayHello, constructor }↑__proto__↑person1 / person2

四、示例验证原型链

console.log(person1.__proto__ === Person.prototype);  // true
console.log(Person.prototype.constructor === Person); // true
console.log(Object.getPrototypeOf(person1) === Person.prototype); // true

五、修改 prototype 和 proto 的区别

修改 prototype:影响所有实例

Person.prototype.greet = function() {console.log("Greetings from " + this.name);
};person1.greet(); // Greetings from Alice
person2.greet(); // Greetings from Bob

修改 proto:仅影响当前对象

const obj = {};
obj.__proto__ = {customMethod: function() {console.log("I am custom!");}
};obj.customMethod(); // I am custom!

六、在类中的表现(ES6+)

在 ES6 中,使用 class 语法定义类,原型机制依然有效:

class Animal {speak() {console.log("Animal speaks");}
}const dog = new Animal();console.log(dog.__proto__ === Animal.prototype);  // true
console.log(Animal.prototype.constructor === Animal); // true

七、为什么 proto 不推荐使用?

  1. 性能问题: __proto__ 是非标准特性,访问速度较慢。
  2. 兼容性问题: 早期版本的 IE 不支持。
  3. 规范性: 建议使用 Object.getPrototypeOf() 代替:
    console.log(Object.getPrototypeOf(person1) === Person.prototype); // true
    

八、总结

比较项prototypeproto
作用构造函数的原型对象实例对象的隐式原型
类型对象对象
修改效果修改后影响所有实例修改后仅影响该实例及其后代
使用场景批量定义共享方法和属性查找实例对象原型链中的属性和方法
推荐使用否,建议使用 Object.getPrototypeOf() 代替

面试高频问题

  1. prototype 和 proto 有什么区别?

    • prototype 是构造函数的属性,__proto__ 是实例对象的属性。
    • prototype 用于定义共享方法和属性__proto__ 用于访问原型链
  2. 如何修改实例的原型?

    • 可以直接使用 Object.setPrototypeOf(obj, newProto);obj.__proto__ = newProto;,但前者性能更优。
  3. 为什么不推荐使用 proto

    • 性能差且非标准化,推荐使用 Object.getPrototypeOf()

希望这些讲解能帮你彻底搞清楚 prototype__proto__ 的区别!


http://www.ppmy.cn/devtools/167603.html

相关文章

数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314)

数据库管理302期 2025-03-14 数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314)1 Oracle RAC2 DMDSC3 YAC4 KES RAC总结 数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314) 作者:胖头鱼的鱼…

封装WPF中转换器常用用法封装

代码经常遇到类型A转换到类型C&#xff0c;但是已经写好类型A转换到类型B、类型B转换类型C。往往遇到这种情况&#xff0c;通常会重新写过一个转换器来进行满足需求。以下是解决该痛点。 /// <summary> /// 转换器组转换器 /// </summary> [ContentProperty(nameo…

【前端实战】一文掌握响应式布局 - 多设备完美适配方案详解

一、前言 在当今互联网时代&#xff0c;用户通过各种设备访问网站已成为常态。如何让网站在不同设备上都能完美展现&#xff1f;本文将通过一个实际案例&#xff0c;详细讲解响应式布局的实现方案。 二、项目效果展示 PC 移动端 平板(ipad Pro) 三、核心实现方案 1. 基础设置…

《DeepSeek 开源 DeepGEMM:开启AI计算新时代的密钥》:此文为AI自动生成

《DeepSeek 开源 DeepGEMM&#xff1a;开启AI计算新时代的密钥》&#xff1a;此文为AI自动生成 引言&#xff1a;AI 计算的新曙光 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最为耀眼的领域之一。从语音助手到自动驾驶&#xff0c;从图像…

基于Spring Boot的航司互售系统

文章目录 项目介绍项目截图项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f34…

使用WireShark解密https流量

概述 https协议是在http协议的基础上&#xff0c;使用TLS协议对http数据进行了加密&#xff0c;使得网络通信更加安全。一般情况下&#xff0c;使用WireShark抓取的https流量&#xff0c;数据都是加密的&#xff0c;无法直接查看。但是可以通过以下两种方法&#xff0c;解密抓…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 &#xff08;1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 &#xff08;3&#xff09;plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 &#xff08;4&#xff09…

uniapp+vue实现购物车的左滑删除功能

左滑删除 删除功能利用透明的改变在显示删除按钮实现思路代码效果展示 利用scroll滑动容器来实现代码实现效果展示 我们在移动端的电商平台中&#xff0c;一般都是左滑后然后删除按钮出现&#xff0c;用户可以点击删除按钮来进行该商品的删除&#xff0c;这里我分享两种方法来达…