返回

深入剖析 JavaScript 中的面向对象:理解 Prototype、__proto__ 和 Constructor

前端

JavaScript 作为一门动态且强大的编程语言,在构建复杂应用程序时,面向对象编程 (OOP) 是一种极其重要的范例。理解 OOP 的核心概念,如原型、proto 和构造函数,对于有效利用 JavaScript 来设计和实现可维护、可重用的代码至关重要。

原型

在 JavaScript 中,每个对象都有一个与之关联的原型对象。原型对象定义了该对象可以访问的属性和方法。当一个对象尝试访问一个它本身没有定义的属性或方法时,JavaScript 引擎会自动在其原型中查找该属性或方法。

例如,考虑以下代码:

const person = {
  name: "John Doe"
};

console.log(person.name); // "John Doe"
console.log(person.age); // undefined

person 对象没有定义 age 属性。但是,当我们尝试访问它时,JavaScript 引擎会检查 person 的原型并找到 age 属性(假设原型中定义了 age 属性)。

proto

proto 属性指向一个对象的原型对象。我们可以使用 proto 属性来访问和修改对象的原型。

以下代码示例演示了如何使用 proto 属性:

console.log(person.__proto__); // { age: 30 }
person.__proto__.age = 35;
console.log(person.age); // 35

构造函数

构造函数是创建新对象的函数。当使用 new 调用构造函数时,JavaScript 引擎会创建一个新对象,该对象将该构造函数的 prototype 属性作为其原型。

例如,考虑以下代码:

function Person(name) {
  this.name = name;
}

const john = new Person("John Doe");

Person 构造函数创建一个新的 Person 对象,并将其作为构造函数的原型。因此,john 对象将能够访问 Person.prototype 中定义的所有属性和方法。

理解面向对象

为了完全理解 JavaScript 中的面向对象,必须了解 prototype、proto 和构造函数之间的相互作用。

  • prototype :每个对象都有一个与之关联的原型对象,其中定义了该对象可以访问的属性和方法。
  • protoproto 属性指向一个对象的原型对象。它可用于访问和修改对象的原型。
  • 构造函数 :构造函数是创建新对象的函数。当使用 new 关键字调用构造函数时,它会创建一个新对象,该对象将该构造函数的 prototype 属性作为其原型。

通过掌握这些概念,您可以充分利用 JavaScript 的面向对象功能,创建可重用、可维护且高效的代码。