之前面试的时候遇到过原型和原型链方面的题目,具体的已经忘了,只记得当时回答的稀里糊涂,今天查了一些资料,把自己所理解的写出来,加深记忆。

1,前提

  在js中,对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型。

  函数比较特殊,它除了和其他对象一样有__proto__属性,还有自己特有的属性----prototype,这个属性是一个指针,指向一个包含所有实例共享的属性和方法的对象,称之为原型对象。原型对象也有一个constructor属性,该属性指回该函数。

2,题目分析

  网上找了一个题目,先分析一下

var F = function () {}
Object.prototype.a = function () {}
Function.prototype.b = function () {} var f = new F()
// 请问f有方法a  方法b吗

  f的__proto__指向F.prototype,F.prototype.__proto__指向Object.prototype,所以f 可以取到a方法, 由于f的原型链上没经过Function.prototype,所以取不到b方法。

 由于构造函数F是由Function new出来的,所以F.__proto__指向Function.prototype,所以F函数可以取到b方法。

  另外一道题目:

  

function Person(){}

let p1 = new Person()
let p2 = new Person()
let obj = {}

  具体的题目我忘记了,差不多就是写出 p1  p2  Person  Function   obj   Object等的原型链。

  p1:      __proto__ :  Person.prototype

  p2:      __proto__ :  Person.prototype

  Person  :         __proto__: Function.prototype,    prototype: Person.prototype

  Person.prototype :         __proto__ : Object.prototype ,  constructor: Person

  Function:       __proto__ : Function.prototype,   prototype: Function.prototype

  Function.Prototype:     __proto__ :  Object.prototype ,   constructor:  Function

  obj:    __proto__ : Object.prototype

  Object:   __proto__ : Function.prototype  ,   prototype:  Object.prototype

  Object.prototype:    __proto__ :  null  ,   constructor  :  Object

  

  具体的就是上面这些了,有两个点需要注意下

    1,Function.__proto__    ===     Function.prototype

      谨记上面的红字部分,每个对象都有__proto__,指向生成该对象的构造函数的原型。 这里Function是一个构造函数,那么它也是一个函数,既然是函数,那也是由Function这个构造函数生成的,也就是它自己本身,所以它的__proto__就指向它自己的prototype

      上面的说法是错误的,这里参考了一位大佬的话语: Function.prototype是引擎创造出来的对象,一开始就有了,又因为其他的构造函数都可以通过原型链找到Function.prototype,Function本身也是一个构造函数,为了不产生混乱,就将这两个联系到一起了。

    2,Object.__proto__  === Function.prototype

      Object是对象的构造函数,那么它也是一个函数,当然它的__proto__也是指向Function.prototype

  这里放一张关于这方面的经典的图

js关于原型,原型链的面试题-LMLPHP

  

05-28 05:46