返回

JS中的原型和原型链,公有方法在哪里?

见解分享

一直以来我们提到了一个词:对象,有的对象之间长得像,有的对象之间长得不一样,那么,他们为什么长得这么像或者为什么长得不一样?如果我们现在将一个函数赋给变量obj1,并给这个变量添加一个属性soso,然后发现函数本身也拥有了这个属性,这是为什么呢?这些对象之间有什么联系吗?我们今天来讲解一下原型链原型的概念。

什么是原型

首先,我们来看一看什么叫做原型,原型是JavaScript中一个非常重要的概念,它是一个对象,用来作为其他对象的模板,当创建一个新对象时,JavaScript会创建一个该对象的原型对象的副本,新创建的对象就会拥有这个副本。

举个例子,我们创建一个函数,并给这个函数赋予一个变量,如下:

function Person() {
  this.name = "John";
  this.age = 25;
}

var obj1 = new Person();

在上面的代码中,我们创建了一个名为Person的函数,并将它赋值给变量obj1,JavaScript会为obj1创建一个副本,并将它赋予一个称为“prototype”的属性,这个属性指向了Person的原型对象,如下:

obj1.__proto__ === Person.prototype

这个属性可以帮助我们访问原型对象,我们可以使用它来给obj1添加新的属性和方法,如下:

obj1.__proto__.job = "Software Engineer";

obj1.job; // "Software Engineer"

在这个例子中,我们给obj1的原型对象添加了一个新的属性job,我们可以通过obj1访问这个属性,这说明原型对象可以影响对象的属性和方法的查找过程。

什么是原型链

原型链是一个对象链,它从一个对象开始,一直到Object.prototype为止,原型链中的每个对象都继承了前一个对象的属性和方法,当我们访问一个对象的属性或方法时,JavaScript会沿着原型链向上查找,直到找到这个属性或方法,如下:

obj1.name; // "John"
obj1.__proto__.job; // "Software Engineer"
Object.prototype.toString.call(obj1); // "[object Object]"

在上面的代码中,我们通过obj1访问了name属性,JavaScript会沿着原型链向上查找,直到找到这个属性,在这个例子中,它会在obj1的原型对象中找到这个属性,我们也可以通过obj1访问job属性,JavaScript会沿着原型链向上查找,直到找到这个属性,在这个例子中,它会在obj1的原型对象的原型对象中找到这个属性,我们还可以通过obj1访问toString方法,JavaScript会沿着原型链向上查找,直到找到这个方法,在这个例子中,它会在Object.prototype中找到这个方法。

原型和原型链的作用

原型和原型链在JavaScript中扮演着非常重要的角色,它们可以帮助我们理解对象的属性和方法的查找过程,并可以帮助我们更好地理解JavaScript的继承机制,同时,原型和原型链还可以帮助我们理解为什么某些对象的行为会与我们的预期不同,希望大家在学习原型和原型链的过程中能有所收获。