__proto__,prototype,constructor之间的关系

晚上加班突然想到这个问题,然后就整理了一下,如果有什么误人子弟的地方,请友情指出!谨遵教诲!(#.#)接下来直奔主题。

function Foo(){}
let f1 = new Foo()

简单说,上面的代码表示创建一个构造函数Foo,然后new一个实例化对象f1。
稍微复杂一点说,就是当函数被调用时,新创建了一个对象,然后将构造函数的作用域赋给了新对象(因此此时函数内部this是指向该新创建的对象)。
虽然是简单的两行代码, 然而他们背后的关系是错综复杂的,我就不找图了。(我不爱看,太繁琐)我就直接用文字赘述了。

1._ _proto _ _属性

我们要谨记,_ _ proto _ _属性是对象独有的,他是由对象指向另外一个对象作用就是当访问一点对象属性的时候,如果该对象不存在这个属性,就会通过__proto__属性所指的那个对象里找,一直找,一直找,直到原型链的顶端null,这个找的行程通过_proto__属性形成了一个链,叫做原型链

2.prototype属性

这个是函数所独有的,他是从一个函数指向一个对象,他的含义就是函数的原型对象,也就是这个函数创建的实例的原型对象,f1._ _ proto _ _===Foo.prototype,作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是可以让该函数所实例化的对象,都可以找到公用的属性和方法。

3.constructor属性

constructor也是对象独有的,他也是由对象指向一个函数,也就是指向该对象的构造函数
constructor是每个实例化对象都拥有的属性,但是这么说不准确,实例化对象f1本身是不具备constructor属性,他是通过__proto__属性到原型链中找的,f1._ _ proto _ ===Foo.prototype,所以Foo.prototype是有constructor属性的,所以
f1.
_ proto_ ===Foo.prototype,

Foo.prototype.constructor===Foo

你可能感兴趣的:(js,js,面试)