关于原型链的一道面试题

34 阅读1分钟
Object.prototype.a = "a1";
Function.prototype.a = "a2";
function Person(){}
let person = new Person();

console.log(person.a); // 1
console.log(Person.a); // 2
console.log(person.__proto__.__proto__.constructor); // 3
console.log(person.__proto__.__proto__.constructor.constructor); // 4

基础知识

  • prototype: 存在于构造函数的身上,指向构造函数对应的原型对象。所有通过该函数构造的实例将继承这个原型对象的属性和方法。
  • __ proto__: 存在于普通对象的身上,指向该对象原型链上一层的原型对象。
  • constructor: 存在于原型对象上,指向该原型对象的构造函数。

题目答案
输出:
a1
a2
[Function Object]
[Function Function]

解析

  • Object.prototype.a = "a1"; // 此处Object为构造函数,想想new Object(),普通对象可以通过原型链找到a1
  • Function.prototype.a = "a2"; // 此处Function为构造函数,函数对象可以通过原型链找到a2
  • let person = new Person(); // person为实例对象
  • person.__ proto__.__ proto__.constructor
    == Person.prototype.__ proto__.constructor
    == Object.prototype.constructor
    == Object