关于修改了Function.prototype中的值,为什么实例上无法获取到

问题

上午看面经看到的一个同学的面试题目

Function.prototype.a = 1;
Object.prototype.b = 2;
var Func = function(){};
var f = new Func();
console.log(f.a, f.b)

测试了一下实际的输出结果是undefined 2

我的理解

我的理解是首先Object.prototype是原型链的顶端,Function.prototype应该是指向了Function的构造函数本身。

然后这个实例f是对象,而不是函数,所以Object.prototype里的值他能读到,而Function.prototype是他的构造函数的原型链,所以他不能读到。

(这两天在补继承和原型链方面的知识,理解不到位请多指出。想知道这个问题大家是如何解释的

阅读 4.4k
3 个回答

f 是构造函数 Func 的实例,他的原型链找到所属类的原型。
f.a 和 f.b 两个属性值,在自己身上找不到。会顺着原型链一直向上查找,直到找到头为止。

图片描述

原型和原型链

参考一下 链接描述 的第二个回答

我跟你的理解差不多;Function.prototype 指向的是所有函数类型的的原型。Object.prototype指向的是所有对象类型的原型 var f = new Func();通过构造函数初始化一个实例对象(对象类型),他关联到Func.prototype对象类型),如果没找到对应的值则会向上查找Object.prototype; 这是原型链的查找;

  • 每一个构造函数都拥有一个prototype属性,这个属性指向一个对象,也就是原型对象
  • 原型对象默认拥有一个constructor属性 ,指向他的那个构造函数(也就是说构造函数和原型对象是互相指向的关系)
  • 每个对象都拥有一个隐藏的_ proto _属性,他指向他的原型对象,这个属性可以通过 Object.getPrototypeOf(obj) 或 obj.proto 来访问。
  • 构造函数的prototype属性与它创建的实例对象的[[prototype]]属性指向的是同一个对象,即 对象.proto === 函数.prototype 。

结合下图很好理解

clipboard.png

推荐问题
宣传栏