js原型与原型链

这是我参与更文挑战的第15天,活动详情查看:更文挑战

基本概念

  • 构造函数:new后面跟着的函数、constructor属性

  • 原型、原型对象 :[构造函数].prototype

  • 实例的私有属性、内部指针:__proto__

原型链

function SuperType() {
  this.property = true
}
SuperType.prototype.getSuperValue = function () {
  return this.property
}
function SubType() {
  this.subproperty = false
}
// 继承 SuperType
SubType.prototype = new SuperType()
SubType.prototype.getSubValue = function () {
  return this.subproperty
}
let instance = new SubType()
// console.log(instance.getSuperValue()) // true
console.log(instance)
复制代码

image-20210623181206180

image-20210623181317176

  • 对于箭头1来说,每个构造函数都有一个prototype属性,指向它的原型对象

  • 对于箭头2来说,在new 一个实例对象的时候,会在实例对象instance中添加一个__proto__私有属性,指向构造函数的原型对象,综合1与2,可以得到instance.__proto__==SubType.prototype

  • 对于箭头3来说,每个原型对象里面都有一个constructor属性,指向它的构造函数

  • 在这里,我们实现了一个简单的继承,当需要使用某个属性时,首先会从实例上查找,没有找到的话,就会去它的原型对象上查找,还没有的话,接着去原型的原型里面去找,这里想调用instance.getSuperValue(),查找顺序就是instance-->SubType.prototype-->SuperType.prototype,

判断类型

instanceof

instanceof是比较常见的判断类型的方法,如果一个实例的原型链中出现过对应的构造函数,那么就为true

console.log(instance instanceof Object); // true
console.log(instance instanceof SuperType); // true
console.log(instance instanceof SubType); // true
复制代码

isPrototypeOf

只要原型链中包含这个原型,这个方法就返回 true:

console.log(Object.prototype.isPrototypeOf(instance)); // true
console.log(SuperType.prototype.isPrototypeOf(instance)); // true
console.log(SubType.prototype.isPrototypeOf(instance)); // true
复制代码

默认原型

在最外层,其实还有一个默认的Object对象,它是所有对象的基础,是原型链的最末端

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享