从根本上认识原型、原型链和继承关系
2024-01-16 08:56:56
前言
对于一个程序员来说,原型的概念非常重要,它为我们理解 JavaScript 中的继承提供了基础。因此,为了在 JavaScript 中更好的应用原型和继承,我们需要对原型和原型链有一个清晰的认识。在本文中,我们将对原型和原型链进行详细的讲解。
什么是原型?
原型(prototype)是一个对象,它包含了一系列属性和方法,这些属性和方法可以被派生的对象所继承。每个 JavaScript 对象都有一个原型对象,这个原型对象是该对象的父对象,它包含了该对象所继承的属性和方法。
原型对象可以通过Object.getPrototypeOf()方法获取。例如,如果我们创建一个对象,我们可以使用以下代码来获取它的原型对象:
const obj = {
name: 'John Doe',
age: 30
};
const proto = Object.getPrototypeOf(obj);
console.log(proto);
输出:
{
constructor: Function,
__defineGetter__: Function,
__defineSetter__: Function,
hasOwnProperty: Function,
isPrototypeOf: Function,
propertyIsEnumerable: Function,
toLocaleString: Function,
toString: Function,
valueOf: Function
}
从输出中可以看到,对象的原型对象是一个包含了大量属性和方法的对象。这些属性和方法都是 JavaScript 内置的对象所拥有的,它们可以被派生的对象所继承。
什么是原型链?
原型链(prototype chain)是指一个对象到其原型对象再到原型对象的原型对象的链条。原型链上的每个对象都包含了一系列属性和方法,这些属性和方法可以被该对象及其派生的对象所继承。
原型链可以通过以下代码来演示:
const obj = {
name: 'John Doe',
age: 30
};
const proto = Object.getPrototypeOf(obj);
const protoProto = Object.getPrototypeOf(proto);
console.log(protoProto);
输出:
null
从输出中可以看到,对象的原型对象的原型对象是 null。这意味着原型链已经到达了终点。
继承
继承是指一个对象从另一个对象继承属性和方法的能力。在 JavaScript 中,继承可以通过原型链来实现。
当一个对象被创建时,它会自动继承其原型对象的所有属性和方法。例如,如果我们创建一个对象,我们可以使用以下代码来访问其原型对象中的属性:
const obj = {
name: 'John Doe',
age: 30
};
console.log(obj.constructor);
输出:
Function
从输出中可以看到,对象的 constructor 属性是其原型对象中的一个属性。这个属性指向了创建该对象的函数。
除了访问原型对象中的属性之外,我们还可以调用原型对象中的方法。例如,如果我们创建一个对象,我们可以使用以下代码来调用其原型对象中的方法:
const obj = {
name: 'John Doe',
age: 30
};
console.log(obj.toString());
输出:
[object Object]
从输出中可以看到,对象的 toString 方法是其原型对象中的一个方法。这个方法返回了对象的字符串表示。
总结
原型、原型链和继承是 JavaScript 中非常重要的概念。理解这些概念对于理解 JavaScript 中的对象和继承至关重要。
原型是一个对象,它包含了一系列属性和方法,这些属性和方法可以被派生的对象所继承。每个 JavaScript 对象都有一个原型对象,这个原型对象是该对象的父对象,它包含了该对象所继承的属性和方法。
原型链是指一个对象到其原型对象再到原型对象的原型对象的链条。原型链上的每个对象都包含了一系列属性和方法,这些属性和方法可以被该对象及其派生的对象所继承。
继承是指一个对象从另一个对象继承属性和方法的能力。在 JavaScript 中,继承可以通过原型链来实现。当一个对象被创建时,它会自动继承其原型对象的所有属性和方法。