返回

解密 JavaScript 中的原型和 __proto__:探索对象继承的奥秘

前端


1. 对象与 Object 的区分

  • JavaScript 中,object 是一种数据类型,八大数据类型之一,如数组、函数、日期、正则表达式等都属于 object 类型。
  • Object 则是一个构造函数,由 Function 定义。

2. prototype 属性

  • 每个 JavaScript 函数(包括构造函数)都有一个 prototype 属性。prototype 属性指向一个对象,该对象包含该函数的所有属性和方法。
  • 当使用 new 运算符调用构造函数时,新创建的对象的 proto 属性将被设置为构造函数的 prototype 属性。

3. proto 属性

  • JavaScript 中的每个对象都有一个 proto 属性,指向另一个对象。这个对象包含了该对象的所有属性和方法。
  • proto 属性可以被用来访问和修改对象的属性和方法。

4. 原型链

  • JavaScript 中的对象形成一个原型链,每个对象都指向其原型对象的 proto 属性。
  • 当访问对象的属性或方法时,JavaScript 会沿着原型链向上查找,直到找到该属性或方法。

5. 对象继承

  • JavaScript 中的对象继承是通过原型链实现的。子对象可以通过 proto 属性访问父对象的所有属性和方法。
  • 子对象也可以通过修改自己的 proto 属性来继承另一个对象的属性和方法。

6. 示例

// 定义一个构造函数
function Person(name) {
  this.name = name;
}

// 为构造函数添加原型属性
Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// 创建一个新对象
const person1 = new Person('John Doe');

// 访问原型属性
person1.greet(); // 输出:Hello, my name is John Doe

7. 总结

  • prototype 和 proto 是 JavaScript 中面向对象编程的重要概念。
  • prototype 是构造函数的属性,指向一个包含该函数所有属性和方法的对象。
  • proto 是对象的属性,指向另一个对象。
  • 原型链是 JavaScript 中的对象继承机制,每个对象都指向其原型对象的 proto 属性。
  • 子对象可以通过 proto 属性访问父对象的所有属性和方法。