1、函数的prototype属性
不管是JS内置的函数,还是我们自定义的函数,每一个函数都有一个prototype属性, 它默认指向一个Object空对象,这个默认的object空对象就是我们所说的原型对象。
例如
// 每个函数都有一个prototype属性, 它默认指向一个对象(即称为: 原型对象)
console.log(Date.prototype)
function fn() {
}
console.log(fn.prototype)
打印输出:
此时看到打印输出的结果有人可能会有疑问,这个prototype属性所指向的对象默认不是为空,打印的结果不应该是一个空对象
{}
,为什么现在打印输出的结果不是一个空对象?
首先,Date()
函数是JS内置的函数,它在创建之后,直接在原型对象上添加了很多方法以供开发者使用。 所以我们现在看到的Date.prototype
原型对象是已经封装好的(在webstorm中,可以按着ctrl键点击进入EcmaScript.js
里面查看)。
其次,我们要知道,这个空对象说的是默认没有我们定义的属性和方法,constructor
属性是每个原型对象都会有的一个属性,它默认指向函数对象 (现在不懂没关系,接下来会说明)。对于__proto__
属性,他是实例化是所拥有的属性,至于为什么会出现在这里,我们之后会有讲解。
2、原型对象的constructor属性
我们在前面已经提到了constructor
这个属性,那么这个属性是干什么的,有什么用呐?
constructor
是原型对象中的一个属性,它指向函数对象。 看文字可能不太好理解,给大家看个图就会明白。
就是说,函数的prototype属性指向一个Object实例对象,这个实例对象的constructor属性又指向这个函数本身。
function fn() {
}
// 原型对象中有一个属性constructor, 它指向函数对象
console.