构造函数、原型对象、实例对象三者分别是什么?
构造函数:是用来创建对象的函数,通过new关键字来声明。
原型对象:每一个函数在创建的时候,系统都会给分配一个对象,这个对象就原型对象。
实例对象:构造函数中通过new关键字返回的对象就是实例对象。
通过一张图来介绍三者之间的关系
构造函数中存在一个prototype属性,这个属性指向它的原型对象;
原型对象中存在一个constructor属性,这个属性指向它的构造函数;
实例对象中存在一个__proto__属性,这个属性指向它的原型对象;
打个比方:三者就相当于一家三口的关系,构造函数相当于爸爸,原型对象相当于妈妈,实例对象相当于儿子,爸爸只能有一个妻子,妈妈只能有一个丈夫,所以它们是相互指向的,而儿子必须需要通过妈妈才能找到自己的亲爸爸(因为妈妈一定是亲的,爸爸就不一定咯),哈哈哈。通过这么一比喻是不是就更容易理解了呢!
通过代码来描述它们之间的关系
//实例对象通过原型对象找到构造函数
console.log(p1.__proto__.constructor)//Person
//实例对象通过属性指向原型对象,构造函数通过属性也指向原型对象
//如果返回值为true那就证明它们拥有同一个原型对象
console.log(p1.__proto__==Person.prototype)//true
new关键字的工作原理(四步)
new创建一个对象;
通过this指向这个对象;
通过this给这个对象赋值;
返回这个对象。
原型对象是为了解决什么问题?
原型对象是为了解决构造函数造成的内存浪费和变量污染的问题。
静态成员和实例成员
静态成员是函数对象的成员
实例成员是实例化对象的成员
// 构造函数
function Person(name, age) {
this.name = name
this.age = age
}
// 实例化对象
let p1 = new Person('张三', 18)
// 静态成员是函数对象的成员
console.log(Person.sex = '男')//静态成员
// 实例成员是实例化对象的成员
console.log(p1.name)//实例成员
console.log(p1.age)//实例成员