返回

万物皆对象,无处不原型

前端

手写面试题六:原型与原型链

前言

在JavaScript中,一切皆对象,包括基本类型(如数字、字符串、布尔值等)和引用类型(如数组、对象、函数等)。每个对象都拥有一个原型,它是一个对象,包含了其他对象可以访问的属性和方法。原型链是一个对象层次结构,它了对象如何继承自其他对象。

原型

对象的原型是一个对象,它包含了其他对象可以访问的属性和方法。当一个对象无法在自身找到某个属性或方法时,它会沿着原型链向上查找,直到找到该属性或方法。

const obj = {
  name: 'John',
};

console.log(obj.name); // 'John'
console.log(obj.age); // undefined

const prototype = Object.getPrototypeOf(obj);
console.log(prototype.toString()); // '[object Object]'
console.log(prototype.hasOwnProperty('toString')); // true

在上面的示例中,obj 对象的原型是 Object.prototype,它包含了所有 JavaScript 对象共享的属性和方法,例如 toString() 方法。

原型链

原型链是一个对象层次结构,它了对象如何继承自其他对象。每个对象都有一个原型,而该原型的原型又是另一个对象,如此循环往复,直到到达 Object.prototype 为止。

const obj = {
  name: 'John',
};

const prototype = Object.getPrototypeOf(obj);
const prototypeOfPrototype = Object.getPrototypeOf(prototype);

console.log(prototypeOfPrototype === Object.prototype); // true

在上面的示例中,obj 对象的原型链为:obj -> Object.prototype -> null

继承

在 JavaScript 中,继承是通过原型链实现的。当一个对象从另一个对象继承时,它会继承后者的原型。这意味着子对象可以访问父对象的所有属性和方法。

const parentObj = {
  name: 'John',
};

const childObj = Object.create(parentObj);

console.log(childObj.name); // 'John'
console.log(childObj.age); // undefined

在上面的示例中,childObjparentObj 继承,因此它可以访问 parentObj 的所有属性和方法。

总结

原型和原型链是 JavaScript 中理解继承的关键概念。原型是包含其他对象可以访问的属性和方法的对象。原型链是一个对象层次结构,它描述了对象如何继承自其他对象。理解原型和原型链对于理解 JavaScript 中的继承至关重要。