返回

JS面向对象:prototype,__proto__,constructor秘辛

前端

前言
在计算机科学领域,面向对象编程(OOP)是一种重要的编程范式。OOP将数据和行为封装在对象中,并通过对象之间的交互来实现程序的逻辑。JavaScript作为一门现代的编程语言,也支持面向对象编程。在本文中,我们将深入探讨JavaScript中的面向对象编程,重点介绍prototype、__proto__和constructor这三个重要概念。通过清晰的示例,我们将了解这些概念是如何相互关联的,以及它们在构建和使用对象时的作用。

对象与类

在JavaScript中,对象是一个具有属性和方法的实体。属性是对象的状态,方法是对象的行为。类是对象的模板,它定义了对象可以具有哪些属性和方法。例如,我们可以定义一个名为“Dog”的类,该类具有“age”属性和“say”方法。

class Dog {
  constructor(age) {
    this.age = age;
  }

  say() {
    console.log(`汪!我今年${this.age}岁了。`);
  }
}

我们可以通过类来创建对象。例如,我们可以创建一个两岁的小狗对象。

const dog = new Dog(2);

prototype、__proto__和constructor

在JavaScript中,每个对象都有一个称为prototype的属性。prototype属性指向对象的原型对象。原型对象是对象的模板,它定义了对象可以继承的属性和方法。例如,Dog类的原型对象具有一个名为“speak”的方法。

Dog.prototype.speak = function() {
  console.log(`汪!我今年${this.age}岁了。`);
};

对象的__proto__属性指向对象的原型对象。例如,dog对象的__proto__属性指向Dog类的原型对象。

console.log(dog.__proto__ === Dog.prototype); // true

对象的constructor属性指向对象的构造函数。例如,dog对象的constructor属性指向Dog类。

console.log(dog.constructor === Dog); // true

继承

在JavaScript中,我们可以通过原型链来实现继承。原型链是指对象的原型对象指向另一个对象的原型对象,依此类推。例如,Dog类的原型对象指向Object类的原型对象。

console.log(Dog.prototype.__proto__ === Object.prototype); // true

这意味着Dog类继承了Object类的属性和方法。例如,Dog类可以继承Object类的toString方法。

console.log(dog.toString()); // "[object Dog]"

结语

通过对JavaScript中prototype、__proto__和constructor这三个重要概念的深入探讨,我们了解了这些概念是如何相互关联的,以及它们在构建和使用对象时的作用。这些概念对于理解JavaScript中的面向对象编程至关重要,也是开发高质量JavaScript应用程序的基础。