返回
万物皆对象,无处不原型
前端
2023-09-29 10:35:01
手写面试题六:原型与原型链
前言
在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
在上面的示例中,childObj
从 parentObj
继承,因此它可以访问 parentObj
的所有属性和方法。
总结
原型和原型链是 JavaScript 中理解继承的关键概念。原型是包含其他对象可以访问的属性和方法的对象。原型链是一个对象层次结构,它描述了对象如何继承自其他对象。理解原型和原型链对于理解 JavaScript 中的继承至关重要。