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

prototype 和 __proto__的区别

prototype__proto__ 在 JavaScript 中都与对象的原型链有关,但它们各自有不同的用途和含义。

prototype

  • prototype 是函数对象的一个属性,它指向一个对象,这个对象包含了可以由特定类型的所有实例共享的属性和方法。
  • 当我们创建一个新的对象实例时,这个实例会继承其构造函数的 prototype 对象上的属性和方法。
  • 我们可以使用 Constructor.prototype.methodName = function() { ... } 的方式来给构造函数的所有实例添加新的方法或属性。

proto

  • __proto__ 是一个非标准的属性,但在大多数现代浏览器中都可用,它指向对象的原型对象。
  • 当你访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript 就会在该对象的原型链上查找这个属性。
  • 需要注意的是,由于 __proto__ 是非标准的,因此在生产环境中应避免使用它,而是使用 Object.getPrototypeOf()Object.setPrototypeOf() 这样的标准方法来访问和修改对象的原型。

区别

  • prototype 是函数对象的一个属性,而 __proto__ 是对象的一个属性(尽管是非标准的)。
  • prototype 用于定义构造函数的所有实例可以共享的属性和方法,而 __proto__ 用于在运行时访问或修改对象的原型。
  • 当你使用 new 关键字创建一个新的对象实例时,这个实例的 __proto__ 会被设置为构造函数的 prototype

示例

function Person() {}
// 通过 prototype 添加方法
Person.prototype.sayHello = function() {console.log("Hello, I am a person!");
};
var person1 = new Person();
// 访问 sayHello 方法,它存在于 person1 的原型链上
person1.sayHello(); // 输出 "Hello, I am a person!";
// 访问 __proto__ 来查看 person1 的原型对象
console.log(person1.__proto__ === Person.prototype); // 输出 true
// 注意:不推荐在生产环境中使用 __proto__
var a = {}, b = Object.prototype;
console.log(a.prototype === b, Object.getPrototypeOf(a)===b);// false, true
// 1、只有函数对象才有prototype,a是普通对象,没有prototype,所以a.prototype是undefined
// 2、当使用字面量 `{}` 或 `new Object()` 来创建一个对象时,这个对象会继承自`Object.prototype`。
// 3、`Object.getPrototypeOf(a)` 是一个方法,它返回指定对象的原型。对于普通对象(如通过 `{}` 或 `new Object()` 创建的对象),这个方法会返回 `Object.prototype`。

总结

prototype__proto__ 都是 JavaScript 原型链机制的一部分,但它们的用途和用法是不同的。在编写健壮和可维护的代码时,应优先使用标准方法(如 Object.getPrototypeOf()Object.setPrototypeOf())来操作对象的原型。

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

相关文章:

  • 网络中未授权访问漏洞(Rsync,PhpInfo)
  • DataWhaleAI分子预测夏令营 学习笔记
  • lnmp php7 安装ssh2扩展
  • 数据库概念题总结
  • 提升用户体验之requestAnimationFrame实现前端动画
  • Mysql慢日志、慢SQL
  • 卫星网络——Walker星座简单介绍
  • C++ Lambda表达式第一篇, 闭合(Closuretype)
  • 移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询
  • 【MySQL】1.初识MySQL
  • 查看电脑显卡(NVIDIA)应该匹配什么版本的CUDA Toolkit
  • 优化:遍历List循环查找数据库导致接口过慢问题
  • NoSQL 之 Redis 配置与常用命令
  • 用SpringBoot打造坚固防线:轻松实现XSS攻击防御
  • 2024机器人科研/研发领域最新研究方向岗位职责与要求
  • 笔记:Newtonsoft.Json 序列化接口集合
  • 【Unity设计模式】✨使用 MVC 和 MVP 编程模式
  • CDH安装和配置流程
  • SpringMVC:SpringMVC执行流程
  • 如何在前端网页实现live2d的动态效果
  • 昇思25天学习打卡营第15天|linchenfengxue
  • 软考中级数据库系统工程师备考经验分享
  • Centos7删除MariaDB
  • 【Docker系列】Docker 镜像构建中的跨设备移动问题及解决方案
  • C++友元函数和友元类的使用
  • 黑马苍穹外卖技术亮点 详情
  • Python酷库之旅-第三方库Pandas(005)
  • javascripr如何设计弹出输入框并在网页内输出输入内容
  • gitee代码初次上传步骤
  • android调用openssl库