这篇文章主要 解决的问题 是:什么是__proto__
?什么是prototype
?他们的关系是什么?在原型链中扮演什么角色?
prototype
是函数的一个属性,在定义构造函数的时候自动建立,它指向函数的原型,被 __proto__
指向。这个原型对象里包含着自定义的方法属性。__proto__
是对象的内部属性,它指向构造器的prototype
,对象依赖它来进行原型链的查询,instanceof方法也是依赖它来判断是否存在继承关系。prototype
只能做为构造函数的属性,而__proto__
能够做为任意对象的属性。看一段代码:函数
function Foo(name) { this.name = name }; Foo.prototype.age = 18; let student = new Foo("holy");
咱们经过一张图来表示这段代码构建的原型链:
这张图中原型链可分红两部分:this
student ---> Foo.prototype ---> Object.prototype ---> null
Foo ---> Function.prototype ---> Object.prototype ---> null
咱们从 对象student
看起:根据 概念3 , prototype 只能做为构造函数的属性,__proto__只能做为对象的属性。因此对象sutdent
只有__proto__,没有prototype。spa
student.prototype; undefined
而 student对象
是Foo构造函数的一个实例,根据 概念2 它的__proto__指向Foo.prototypeprototype
student.__ptoto__ == Foo.prototype; true
觉得 Foo.prototype
是一个对象,因此 Foo.prototype.__proto__指向 Object.prototypecode
Foo.prototype.__proto__ == Object.prototype; true
再来看第二部分:Foo 是一个函数
,因此 Foo.__proto__指向 Function.prototype对象
Foo.__proto__ == Function.prototype true
再 JavaScript 中函数都是第一公民,并且函数也是对象,因此Function.prototype.__proto__指向 Object.prototype继承
Function.prototype.__proto__ == Object.prototype true
student.name
在student中找到 name属性,返回“holy”;student.age
在student中未找到,因而经过student.__proto__在Foo.prototype中找到,返回 18;student.toString()
在student中未找到,接着经过student.__proto__在Foo.prototype中寻找,未找到,继续经过Foo.prototype.__proto__在Object.prototype中寻找,找到了,返回‘[object object]’。student.getWeight()
依次在student、Foo.prototype、Object.prototype中寻找,均未找到,抛出错误。