原型: ** Every function has a prototype property and it contains an object **
这句话就是说,每个函数都有一个属性叫做原型,这个属性指向一个对象。(这个对象我们称为原型对象)
构造函数:通过 new 函数名来实例化对象的函数叫构造函数 ,任何函数都可以作为构造函数存在。
原型对象:在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做原型对象,存放在堆中
3. 原型与构造函数的关系
注:es5 构造函数声明是function es6 构造函数声明是class
每一个class 都有一个显示原型 prototype 属性
每一个对象都有一个隐式原型_proto_属性。
每一个对象的隐示原型都指向对应class 的显示原型
列如:
class Student {
constructor(name){
this.name = name;
}
studentName(){
console.log(`studentName:${this.name}`);
}
}
const zhangsan = new Student('张三')
zhangsan.__proto__ === Student.prototype // true 对象的隐示原型指向对应class的显示原型
堆栈示意图
图中class(函数) Student.prototype 和实力对象zhangsan._proto_指向的是同一个堆内存地址
原型链:对象的隐式原型指向对应构造函数的显示原型无限向上查找形成链式结构
如下图
3.instanceof
A instanceof B
instanceof 是用来判断一个对象的原型链上是否存在另一个函数的原型对象,如果存在,就说名这个对像是从这个函数或子类创出出来的