function Foo(name)
{
this.name=name;
}
let f1=new Person('小明'); //经过new操做符构造一个Person实例
console.log(f1.name) // 小明复制代码
虽然是简简单单的两行代码,然而它们背后的关系倒是错综复杂的,以下图所示:bash
看到上面的图片,确定有人看不下去了,说实话,我刚开始看到这张图片,我也不想看了,不过今天我会跟你们讲清楚函数
1.这里面有几个重要属性,你们必定得明白,prototype,_proto_,constructor,js里万物皆对象,其中,prototype(原型属性)是函数所独有的,_proto_和constructor属性是对象所独有的,因 为函数也是对象,因此函数拥有以上三种属性。ui
一:prototype(原型属性)this
这个属性是函数独有的,它是函数内部的一个指针,它指向一个原型对象 即 Person.prototype,这是构造函数的原型对象,它是从函数指向对象它的spa
二:_proto_(这是一个隐藏的属性)prototype
由上图你们能够看到: f1._proto_===Foo.prototype Foo()._proto_===Function.prototype指针
它是从对象指向对象,它指向父级的原型对象,在建立实例对象时,实例在调用属性或者方法时会先去构造函数内部寻 找,若是没找到,实例对象就会去_proto_属性所指向的父级原型对象上寻 找,f1._proto_===Foo.prototype若是仍是没有则继续往上找(这就是一条原型链) 即Foo.prototype._proto_===Object.prototype,若是仍是没有就继续往上,Object.prototype._proto_===null,直到寻找到原型链的顶端nullcode
三:constructor(构造函数属性)cdn
这是一个构造函数属性,它指向一个函数:f1.constructor===Foo.prototype.constructor===Foo()对象
Foo().constructor===Function();
__proto__
和constructor
属性是
prototype
属性是
__proto__
和constructor
属性。__proto__
属性的
__proto__
属性所指向的那个对象(父对象)里找,一直找,直到__proto__
属性的终点
undefined
,经过__proto__
属性将对象链接起来的这条链路即
prototype
属性的
f1.__proto__ === Foo.prototype
。constructor
属性的含义就是
初学者可能会在何谓指向上困惑,所谓指向不过就是一个代称或者叫别名也好,好比一我的