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

prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?

在 JavaScript 中,prototype__proto__ 都与原型链相关,但它们的角色和用途有本质区别:


1. prototype__proto__ 的区别

特性prototype__proto__
归属对象仅函数对象拥有(如构造函数)所有对象默认拥有(包括函数对象)
作用定义构造函数创建实例时的原型模板指向实例对象的实际原型对象
关系构造函数的 prototype 是实例的 __proto__实例的 __proto__ 指向其构造函数的 prototype
示例function Foo() {}
Foo.prototype
const obj = {}
obj.__proto__
核心区别
  • 构造函数视角
    函数的 prototype 是一个显式定义的模板对象,用于给所有通过 new 创建的实例提供共享属性和方法。

  • 实例视角
    对象的 __proto__ 是一个隐式引用,指向它的构造函数的 prototype,形成原型链。

代码示例
function Person(name) {this.name = name;
}// 构造函数的 prototype 定义共享方法
Person.prototype.sayHello = function() {console.log(`Hello, I'm ${this.name}`);
};const alice = new Person("Alice");// 实例的 __proto__ 指向构造函数的 prototype
console.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true

2. 手动修改对象的原型

JavaScript 允许通过以下方式动态修改对象的原型:

方法 1:Object.setPrototypeOf(obj, proto)
  • 作用:直接设置对象的 [[Prototype]](即 __proto__)。
  • 示例
    const parent = { value: 42 };
    const child = {};// 修改 child 的原型为 parent
    Object.setPrototypeOf(child, parent);console.log(child.value); // 42(通过原型链访问)
    
方法 2:obj.__proto__ = proto
  • 作用:通过 __proto__ 属性直接赋值(非标准,但广泛支持)。
  • 示例
    const parent = { value: 42 };
    const child = {};child.__proto__ = parent;
    console.log(child.value); // 42
    
方法 3:创建时指定原型(Object.create()
  • 作用:在对象创建时直接指定原型。
  • 示例
    const parent = { value: 42 };
    const child = Object.create(parent); // child 的原型是 parentconsole.log(child.value); // 42
    

注意事项

  1. 性能问题
    动态修改原型(如 Object.setPrototypeOf)可能影响 JavaScript 引擎的优化,尽量避免在性能敏感场景使用。

  2. 更安全的替代
    优先使用 Object.getPrototypeOf(obj) 获取原型,避免直接操作 __proto__

  3. 构造函数场景
    若需批量修改实例的原型,应直接修改构造函数的 prototype

    function Animal() {}
    Animal.prototype.eat = function() {};function Dog() {}
    // 让 Dog 的实例继承 Animal 的原型
    Dog.prototype = Object.create(Animal.prototype);
    

总结

  • prototype 是构造函数的显式原型模板__proto__ 是实例的隐式原型引用
  • 修改原型时,优先使用 Object.create()Object.setPrototypeOf(),避免直接操作 __proto__

文章转载自:

http://06IzTm7R.wtwhj.cn
http://9lNL4WML.wtwhj.cn
http://0cb8bxG0.wtwhj.cn
http://zL9cyXte.wtwhj.cn
http://7M6YYegL.wtwhj.cn
http://yAaHWN9c.wtwhj.cn
http://G6MUX7QV.wtwhj.cn
http://RsT6R07t.wtwhj.cn
http://dEtI0Vg1.wtwhj.cn
http://ihNdo7aP.wtwhj.cn
http://xb8hKQ05.wtwhj.cn
http://my1sxg2f.wtwhj.cn
http://9yvyjUqS.wtwhj.cn
http://8cRd8W0R.wtwhj.cn
http://2QMjmpFS.wtwhj.cn
http://lgZvVG7n.wtwhj.cn
http://jtTgCS9S.wtwhj.cn
http://tdFkC6Nw.wtwhj.cn
http://Yx5eXMXS.wtwhj.cn
http://aYW63jMn.wtwhj.cn
http://HLAgZjeh.wtwhj.cn
http://Q8sBn4Py.wtwhj.cn
http://OBOkgwN1.wtwhj.cn
http://gcMtJ0tM.wtwhj.cn
http://LXqhnZOe.wtwhj.cn
http://NVTgs1gX.wtwhj.cn
http://Ro5JlhAH.wtwhj.cn
http://4n3OVBdT.wtwhj.cn
http://j1haNIrp.wtwhj.cn
http://22ZNMD4P.wtwhj.cn
http://www.dtcms.com/a/136783.html

相关文章:

  • 聊聊Spring AI Alibaba的MarkdownDocumentParser
  • Go语言实现OAuth 2.0认证服务器
  • 独家!美团2025校招大数据题库
  • 鸿蒙开发之嵌套对象更新
  • FPGA_YOLO(四)用HLS实现循环展开以及存储模块
  • 【WPF-VisionMaster源代码】应用OpenCVSharp仿Vision Master页面开发的软件源代码
  • C++学习之游戏服务器开发git命令
  • [MERN] 项目实战】MERN Multi-Vendor 电商平台开发笔记(v1.0 初版结构 + 技术实践)
  • 树莓派超全系列教程文档--(28)boot文件夹内容
  • Ngrok 内网穿透实现Django+Vue部署
  • vscode连接windows服务器出现过程试图写入的管道不存在
  • AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • 【STM32-代码】
  • C#: 用Libreoffice实现Word文件转PDF
  • 磁芯为什么会有磁性?磁性材料的磁滞曲线还记得吗?
  • Vue2 nextTick
  • 算法——直接插入排序
  • vue3 defineExpose的使用
  • 工厂模式实现案例
  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON
  • 吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
  • 快速入手-基于python和opencv的人脸检测
  • Java学习手册:Java锁机制详解