返回

对象原型__proto__,一个幸福的一家三口

前端

构造函数、对象实例和原型对象

在JavaScript中,对象原型__proto__是一个非常重要的概念。它允许我们创建复杂的对象层次结构,并在对象之间共享属性和方法。

  • 构造函数 :构造函数是一个函数,它用于创建对象实例。
  • 对象实例 :对象实例是使用构造函数创建的对象。
  • 原型对象 :原型对象是所有对象实例共享的父对象。

__proto__属性

每个对象都有一个__proto__属性,该属性指向其原型对象。这允许对象访问原型对象中的属性和方法。

例如,以下代码创建一个构造函数Person,该构造函数有一个属性name和一个方法greet:

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

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}!`);
};

现在,我们可以使用这个构造函数来创建对象实例:

const person1 = new Person('John');
const person2 = new Person('Mary');

这两个对象实例都有一个name属性和一个greet方法。这是因为它们都继承了这些属性和方法自原型对象Person.prototype。

我们可以使用__proto__属性来访问原型对象:

console.log(person1.__proto__); // Person { greet: [Function: greet] }
console.log(person2.__proto__); // Person { greet: [Function: greet] }

原型对象与实例对象的区别

原型对象和实例对象是不同的。原型对象是所有对象实例共享的父对象,而实例对象是使用构造函数创建的特定对象。

原型对象具有以下特点:

  • 它包含所有对象实例共享的属性和方法。
  • 它不能被实例对象覆盖。
  • 它可以通过__proto__属性访问。

实例对象具有以下特点:

  • 它具有自己的属性和方法,这些属性和方法可以覆盖原型对象中的属性和方法。
  • 它可以通过点运算符访问。
  • 它不能访问原型对象中的私有属性和方法。

使用原型对象共享属性和方法

原型对象可以用于共享属性和方法。这可以使代码更简洁、更易于维护。

例如,以下代码创建一个构造函数Car,该构造函数有一个属性model和一个方法drive:

function Car(model) {
  this.model = model;
}

Car.prototype.drive = function() {
  console.log(`Driving a ${this.model}!`);
};

现在,我们可以使用这个构造函数来创建对象实例:

const car1 = new Car('Toyota');
const car2 = new Car('Honda');

这两个对象实例都有一个model属性和一个drive方法。这是因为它们都继承了这些属性和方法自原型对象Car.prototype。

我们可以使用原型对象来共享其他属性和方法,例如,我们可以添加一个getColor方法:

Car.prototype.getColor = function() {
  return this.color;
};

现在,我们可以使用这个方法来获取对象的color属性:

console.log(car1.getColor()); // undefined
car1.color = 'red';
console.log(car1.getColor()); // red

总结

原型对象是JavaScript中一个非常重要的概念。它允许我们创建复杂的对象层次结构,并在对象之间共享属性和方法。这可以使代码更简洁、更易于维护。