JavaScript 是一门基于原型的语言,而不是基于类的语言。这意味着 JavaScript 中的每个对象都有一个原型,原型又可以通过原型链进行链接,从而形成了一种继承关系。在 JavaScript 中,原型和原型链是非常重要的概念,因此我们需要深入了解它们。
首先,我们来看看 JavaScript 中的对象。在 JavaScript 中,对象可以通过对象字面量、构造函数、Object.create() 等方式创建。每个对象都有一个隐藏的属性 proto,它指向该对象的原型。原型本质上也是一个对象,它包含了一些属性和方法。如果一个对象调用了某个方法或属性,而它本身并没有这个方法或属性,那么它就会通过原型链查找它的原型,看看原型是否有这个方法或属性。
例如,我们创建了一个对象 person:
let person = { name: "Tom", age: 20};
那么,person 对象的原型就是 Object.prototype。如果我们想在 person 对象中使用 toString() 方法,它会先在 person 对象中查找,然后发现没有这个方法,就会去 Object.prototype 中查找,最终找到了 toString() 方法。
现在,我们来看一下原型链的概念。在 JavaScript 中,每个对象都有一个原型,而原型也可以拥有自己的原型,形成了一条原型链。在查找某个属性或方法时,JavaScript 引擎会先在该对象本身查找,如果没有找到,就会去该对象的原型中查找,如果还没有找到,就会去原型的原型中查找,直到找到该属性或方法或者到达原型链的顶端为止。
例如,我们创建了一个对象 person,它的原型是 Object.prototype,而 Object.prototype 又有自己的原型 null。这样就形成了一个原型链:person -> Object.prototype -> null。
letperson= { name: "Tom", age: 20}; console.log(person.toString()); // "[object Object]"
在上面的代码中,我们调用了 person 对象的 toString() 方法,而实际上 person 对象并没有这个方法,但是它通过原型链找到了 Object.prototype 中的 toString() 方法。