javascript-原型和原型链

原型

每个函数都有一个默认的原型对象 - prototype ,通过 prototype 我们可以扩展 js 的内置对象。一个函数和它创建的实例共享这个函数的原型属性和方法。实例对象的 constructor 会指向构造函数

原型链

每个实例对象都会有一个隐式原型属性 __proto__,通过 __proto__ 指针指向创建该对象的构造函数的原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 Object.prototype,而 Object.prototype.__proto__ === null

可以看到:

  • 对象都能通过 __proto__ 属性找到 Object.prototypeObject.create(null) 创造出的对象例外,因为没有 __proto__ 属性。
  • 函数都能通过 __proto__ 属性找到 Function.prototype
  • Object 本身是个构造函数,是 Function 的实例

根据规范不建议直接使用 __proto__,推荐使用 Object.getPrototypeOf()

instanceOf 的原理

比如 A instanceOf B,会先沿着 A 的原型链一直向上找,如果能找到一个 __proto__ 等于 B 的 prototype,则返回 true;如果找到终点还没找到则返回 false

function _instanceOf(A, B) {
   
  if (!A || !B) {
   
    return false;
  }
  let O = B.prototype;
  A = A.__proto__;
  while (true)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值