JS原型和原型链

构造函数:function F1 (){}; 实例对象:let f1 = new F1(); Object.prototype.toString.call(F1) // "[object Function]" Object.prototype.toString.call(f1) // "[object Object]"

一、原型
也是一个对象(被继承的对象被称作原型)。用来给实例共享属性和方法(实例对象可以继承原型对象的属性)
继承:当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾(null)
1、指向原型的属性
  • prototype
函数才会有的属性,该属性指向原型(也是一个对象,包含_proto_和constructor)
console.log(f1.prototype) //undefined console.log(F1.prototype) ↓↓↓↓

JS原型和原型链
文章图片
image.png
  • _proto_
除null以外每一个js对象都具备的属性,构造函数实例化的对象 使用这个属性来指向 构造函数的原型
console.log(f1.__proto__ === F1.prototype) // true console.log(f1.__proto__) // ↓↓↓↓

JS原型和原型链
文章图片
image.png JS原型和原型链
文章图片
image.png 2、指向构造函数的属性
  • constructor
每个原型(F1.prototypef1._proto_)的该属性都指向关联的构造函数
F1.prototype.constructor // F1(){} f1.__proto__.constructor // F1(){} f1.constructor // F1(){} 实例对象可以继承原型对象的属性

二、原型链
【JS原型和原型链】每个对象使用_proto_直到值为null的链
f1.__proto__ === F1.prototype // true F1.prototype.__proto__ === Object.prototype // true Object.prototype.__proto__ === null // truef1.__proto__.__proto__.__proto__ // null

    推荐阅读