返回

函数原型与构造函数prototype

前端

当今的网络世界纷繁复杂,网页上的代码也变得越来越难懂。因此,我们需要掌握一些基本的JavaScript知识来帮助我们理解这些代码。其中,protoprototype 这两个概念是JavaScript中非常重要的概念,理解它们对于理解JavaScript中的原型继承机制至关重要。

在JavaScript中,每个函数都有一个prototype 属性,该属性的值是一个原型对象。每个对象都有一个**proto** 属性(null除外),该属性指向构造函数的原型prototype 。构造函数的原型对象的**proto** 属性指向Object.prototype。protoprototype 之间的关系可以用下图表示:

Object.prototype
   |
   V
Constructor.prototype
   |
   V
constructor() { ... }
   |
   V
instance1
   |
   V
instance1.__proto__
   |
   V
Constructor.prototype

从图中可以看出,protoprototype 都是指向原型对象的指针,但它们的指向方向是不同的。proto 指向的是当前对象的原型对象,而prototype 指向的是构造函数的原型对象。

protoprototype 之间最主要的区别在于:proto 是实例属性,而prototype 是构造函数属性。这意味着**proto** 只能在实例对象上使用,而prototype 只能在构造函数上使用。

proto 属性用于访问实例对象的原型对象,而prototype 属性用于修改构造函数的原型对象。当我们修改构造函数的原型对象时,所有该构造函数创建的实例对象都会受到影响。

protoprototype 这两个概念在JavaScript中非常重要,理解它们对于理解JavaScript中的原型继承机制至关重要。

函数原型与构造函数prototype

在JavaScript中,每个函数都有一个prototype属性,值是一个原型对象。每个对象都有一个__proto__属性(null除外),指向构造函数的原型prototype。构造函数的原型对象的__proto__属性指向Object.prototype。

prototype 属性是构造函数的属性,而**proto** 属性是实例对象的属性。这意味着prototype 只能在构造函数上使用,而**proto** 只能在实例对象上使用。

prototype 属性用于修改构造函数的原型对象,而**proto** 属性用于访问实例对象的原型对象。当我们修改构造函数的原型对象时,所有该构造函数创建的实例对象都会受到影响。

prototype 和**proto** 这两个概念在JavaScript中非常重要,理解它们对于理解JavaScript中的原型继承机制至关重要。

示例

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');

person1.greet(); // Hello, my name is John.
person2.greet(); // Hello, my name is Mary.

在这个示例中,Person 函数的prototype 属性是一个对象,该对象包含一个greet 方法。person1person2 都是Person 函数创建的实例对象,它们的**proto** 属性都指向Person.prototype 对象。因此,person1person2 都可以访问greet 方法。

当我们修改Person.prototype 对象时,所有Person 函数创建的实例对象都会受到影响。例如,如果我们将Person.prototype.greet 方法修改为以下内容:

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
};

那么,person1person2greet 方法都会受到影响,它们都会输出以下内容:

Hello, my name is John and I'm undefined years old.
Hello, my name is Mary and I'm undefined years old.

这是因为person1person2 的**proto** 属性都指向Person.prototype 对象,而Person.prototype 对象的greet 方法已经被修改。

结论

protoprototype 是JavaScript中非常重要的概念,理解它们对于理解JavaScript中的原型继承机制至关重要。proto 属性用于访问实例对象的原型对象,而prototype 属性用于修改构造函数的原型对象。当我们修改构造函数的原型对象时,所有该构造函数创建的实例对象都会受到影响。