📜  JavaScript OOP原型对象(1)

📅  最后修改于: 2023-12-03 15:31:38.142000             🧑  作者: Mango

JavaScript OOP 原型对象

JavaScript 是一种基于对象的编程语言。它实现对象的方式是通过原型对象。原型对象是一个包含所有可分享属性和方法的对象,其他对象可以通过它来继承这些属性和方法。在本文中,我将介绍 JavaScript 中的原型对象,以及它如何实现面向对象编程。

基本概念

在 JavaScript 中,每个对象都有一个内部属性叫做 [[prototype]],它指向其原型对象。该对象有一个特殊的属性叫做 “constructor”,它指向创建该对象的构造函数。每个对象都可以访问其原型对象的属性和方法。如果一个对象上没有找到属性或方法,它会去其原型对象上查找。如果还没有找到,就会去原型对象的原型对象上查找,以此类推,直到找到位置。这被称为原型链。下图说明了原型链的结构:

Prototype-Chain

如图所示,每个对象都有一个原型对象。根据这个规律,我们可以把对象看作是一棵树,每个节点都有一个指向其父节点的指针。这个指针指向其原型对象。

创建原型对象

我们可以使用构造函数来创建原型对象。在 JavaScript 中,每个构造函数都有一个原型对象,我们可以使用它来共享方法和属性。所有从该构造函数实例化的对象都会继承原型对象的方法和属性。

以下代码演示如何在 JavaScript 中创建原型对象:

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

Person.prototype.greet = function() {
  console.log("Hello, " + this.name);
}

var john = new Person("John");
john.greet();

在上面的代码中,我们通过构造函数创建了一个原型对象。通过 Person.prototype 扩展该对象,以添加在 Person 构造函数的每个实例中共享的方法和属性。在上面的例子中,我们定义了一个 greet() 方法,它可以从 john 实例访问。

prototype 和 proto 属性

在我们的讨论中,还有两个特殊的属性需要提到。分别是对象的 prototype__proto__ 属性。它们是原型对象的引用。

prototype 属性

prototype 属性是每个函数对象的一个属性,它指向该函数的原型对象。原型对象包含所有该函数实例所共享的属性和方法。我们可以通过扩展该对象来为所有实例对象提供相同的行为和属性。

以下代码演示了如何改变构造函数的原型对象:

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

Person.prototype.greet = function() {
  console.log("Hello, " + this.name);
}

var john = new Person("John");

// Changing the prototype object for all instances
Person.prototype.goodbye = function() {
  console.log("Goodbye, " + this.name);
}

john.goodbye();

在上面的代码中,我们扩展了构造函数 Person 的原型对象,添加了 goodbye() 方法。所有使用 Person 创建的实例都可以访问该方法。

proto 属性

JavaScript 中的每个对象都有一个使用 __proto__ 属性引用的原型对象。该属性指向该对象的原型对象。我们可以使用 Object.create() 方法继承其他对象的方法和属性。

以下代码演示了如何通过 Object.create() 方法继承原型对象的属性和方法:

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

Person.prototype.greet = function() {
  console.log("Hello, " + this.name);
}

var john = Object.create(Person.prototype);
john.name = "John";

john.greet();

在上面的代码中,我们创建了一个新对象 john,它的原型对象是 Person 构造函数的原型对象。我们通过 Object.create() 方法来创建该对象并把该对象的原型对象指向了 Person.prototype

在这里我们声明一个 Person 构造函数,其中构造函数的原型中定义了一个 greet 方法。然后,我们创建了一个新的对象 john,并指定它的原型为 Person 构造函数的原型。这样,john 对象就继承了原型对象的所有属性,包括 greet 方法。我们显示了 john 对象的 name 属性,并调用它的 greet 方法。

总结

JavaScript 中的原型对象是一个强大且灵活的概念。它允许我们使用对象来实现面向对象编程的方法,而不是使用类。原型对象可以让我们轻松共享方法和属性,并通过原型链来实现继承。同时,JavaScript 中的每个对象都有一个 __proto__ 属性,它指向该对象的原型对象。这在使用 Object.create() 继承其他对象的方法和属性时非常有用。