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())来操作对象的原型。

相关推荐

  1. prototype __proto__区别

    2024-07-12 00:56:01       25 阅读
  2. 原型原型链区别,__proto__prototype区别

    2024-07-12 00:56:01       36 阅读
  3. prototype __proto__

    2024-07-12 00:56:01       57 阅读
  4. 经典面试题prototype proto 区别是什么

    2024-07-12 00:56:01       32 阅读
  5. prototype、__proto__、constructor、原型、原型链

    2024-07-12 00:56:01       64 阅读
  6. SpringBoot当中SingletonPrototype详解

    2024-07-12 00:56:01       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 00:56:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 00:56:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 00:56:01       58 阅读
  4. Python语言-面向对象

    2024-07-12 00:56:01       69 阅读

热门阅读

  1. Spring-Data-Elasticsearch

    2024-07-12 00:56:01       27 阅读
  2. npm ERR! code ENOTEMPTY npm ERR! syscall rename npm ERR!

    2024-07-12 00:56:01       22 阅读
  3. sizeof()

    2024-07-12 00:56:01       24 阅读
  4. Python 四种字符串格式化方式

    2024-07-12 00:56:01       23 阅读
  5. 存取款系统接口设计

    2024-07-12 00:56:01       20 阅读
  6. SpringBoot 自定义异常返回数据格式

    2024-07-12 00:56:01       21 阅读
  7. ubuntu 安装cups和爱普生打印机

    2024-07-12 00:56:01       20 阅读
  8. 服务器怎么进PE系统?

    2024-07-12 00:56:01       25 阅读
  9. 还在代码中写HttpUtil?是时候说再见啦

    2024-07-12 00:56:01       24 阅读
  10. selenium常用方法

    2024-07-12 00:56:01       24 阅读
  11. (九)Docker 的网络通信

    2024-07-12 00:56:01       22 阅读