前言
你好呀😉✌,我是你的人类朋友!
今天给大家整理一下原型与原型链的相关知识中prototype
、__proto__
和constructor
的区别!!
本文章可以帮助各位:
- 掌握
prototype
、__proto__
和constructor
的指向问题
大家重点记住我标出来的几句话哦😁
内容
构造函数
是什么?
js
function Student() {
this.name = '你的人类朋友',
this.age = 18
}
上面就是一个构造函数,构造函数的首字母约定大写
实例对象
是什么?
js
let student = new Student()
new
对应的构造函数
出来的实例,就是对应构造函数
的实例对象
请大家记住第一句话:每个函数都有一个 prototype 属性
上面所说的构造函数
也是一个函数
也就是说每一个构造函数
也有一个prototype
属性咯。答案是肯定的,让我们打印看看。
js
function Student() {
this.name = '你的人类朋友',
this.age = 18
}
console.log(Student.prototype) // {constructor: ƒ}
我们确实打印出东西了
请大家记住第二句话:每一个对象(除了null)都有__proto__属性
我们上面说的实例对象
,不也是一个对象吗?那也就是说任何一个实例对象
都会有一个属性名字叫做__proto__
吗?答案是肯定的
js
function Student() {
this.name = '你的人类朋友',
this.age = 18
}
let student = new Student()
console.log(student.__proto__) // {constructor: ƒ}
请大家记住第三句话:实例对象的__proto__属性指向的内容与其对应构造函数的prototype属性所指向的内容一致
我们首先用代码来验证这第三句话
js
function Student() {
this.name = '你的人类朋友',
this.age = 18
}
let student = new Student()
console.log(Student.prototype === student.__proto__) // true
下面的内容帮助大家理解这一句话,大家不要被这句话吓到了!
以我们上面的Student
和实例对象student
为例,让我们来捋一捋:
Student
是一个构造函数,我们知道每一个函数
都会有一个prototype
属性。student
是一个实例对象
,我们知道每一个对象
(除了null)都会有一个属性,属性名叫做__proto__
- 第三句话所说的就是,
Student
的prototype
属性指向了student
的__proto__
属性
下面我画一张图帮助大家理解

请大家记住第四句话:constructor与prototype互逆
直接上图!!

严谨起见,我们还是使用代码验证一下:
js
function Student() {
this.name = '你的人类朋友',
this.age = 18
}
console.log(Student.prototype.constructor === Student) // true
好了,现在我来总结一下上述内容,大家只要记住我强调的那四句话就好啦
- 每个
函数
都有一个prototype
属性 - 每一个
对象
(除了null)都有__proto__
属性 实例对象
的__proto__
属性指向的内容与其对应构造函数
的prototype
属性所指向的内容一致constructor
与prototype
互逆
结语
我是你的人类朋友😉,大家可以把上面的四点记号,指向内容应该就没问题啦。
有错误提出来我会改的,尽量别骂人啊!!!😢
下次再见咯😁😁😁!!