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) ↓↓↓↓
image.png
  • _proto_

除null以外每一个js对象都具备的属性,构造函数实例化的对象 使用这个属性来指向 构造函数的原型

console.log(f1.__proto__ === F1.prototype) // true
console.log(f1.__proto__) // ↓↓↓↓
image.png
JS原型和原型链_第1张图片
image.png
2、指向构造函数的属性
  • constructor

每个原型(F1.prototypef1._proto_)的该属性都指向关联的构造函数

F1.prototype.constructor // F1(){}
f1.__proto__.constructor // F1(){}
f1.constructor // F1(){} 实例对象可以继承原型对象的属性

二、原型链

每个对象使用_proto_直到值为null的链

f1.__proto__ === F1.prototype // true
F1.prototype.__proto__ === Object.prototype // true
Object.prototype.__proto__ === null // true

f1.__proto__.__proto__.__proto__ // null

你可能感兴趣的:(JS原型和原型链)