javascript原型链图解的总结和实践

 更新时间:2021年12月30日 15:12:21   作者:夏天的骑士  
这篇文章主要为大家介绍了javascript原型链图解的总结和实践,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

原型链

在ES6中引入了class关键字,但是JS依然是基于原型的,class实际上是语法糖。

举个例子,有一个people class:

class People {
  constructor(props) {
    this.name = props.name;
  }
  run() {
    console.log('run')
  }
}

通过new people 这个class 产生了许多的人,张三,李四:

let lisi = new People('李四')

但是茫茫人海中,有一类人天赋异禀,他们这类人叫做超级英雄 class Hero

class Hero extends People {
   constructor(props) {
    super(props);
    this.power = props.power
   }
   heyHa() {
       alert(this.power)
   }
}

class Hero 继承了 People,所以英雄首先是个人,具有run方法,然后Hero具备普通人不具备的超能力heyHa方法。我们可以定义有一个英雄叫做Jinx,具有cannon的超能力:

let Jinx = new Hero({ name: 'jinx', power: 'cannon!' })

尽管实例Jinx没有定义run方法,但是通过原型链可以查找到People的原型上具有这个run方法,即它的隐式原型__proto__指向构造函数的原型

在这里插入图片描述

当实例访问某个方法或属性时,会从自身开始,然后往原型链上回溯查找

Jinx.heyHa() // cannon!
// 当自身有该方法时
Jinx.run = () => console.log('i just fly!')
Jinx.run() // i just fly!

那么People.prototype.__proto__指向哪里呢?Object.prototype, 在控制台中输入代码可以看到:

在这里插入图片描述

Object.prototype__prototype__ 等于 null,宇宙的尽头是虚无。。

在这里插入图片描述

至此完整的原型链图就是这样的:

在这里插入图片描述

我们可以基于原型链来实现一个简易的JQuery库

class JQuery {
  constructor(selector, nodeList) {
    const res = nodeList || document.querySelectorAll(selector);
    const length = res.length;
    for (let i = 0; i < length; i++) {
      this[i] = res[i]
    }
    this.length = length;
    this.selector = selector;
  }
  eq(index) {
    return new JQuery(undefined, [this[index]]);
  }
  each(fn) {
    for(let i = 0; i < this.length; i ++) {
      const ele = this[i]
      fn(ele)
    }
    return this;
  }
  on(type, fn) {
    return this.each(ele => {
      ele.addEventListener(type, fn, false)
    })
  }
  // 扩展其他 DOM API
}
const $$ = (selector) => new JQuery(selector);
$$('body').eq(0).on('click', () => alert('click'));

在控制台中运行一下,结果如下:

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 值得学习的JavaScript调试技巧分享

    值得学习的JavaScript调试技巧分享

    这篇文章主要给大家介绍了一些JavaScript调试技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 微信小程序学习之数据处理详解

    微信小程序学习之数据处理详解

    这篇文章主要给大家介绍了关于微信小程序中数据处理的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 小程序实现日历打卡功能

    小程序实现日历打卡功能

    这篇文章主要为大家详细介绍了小程序实现日历打卡功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用contextMenu插件实现Bootstrap table弹出右键菜单

    使用contextMenu插件实现Bootstrap table弹出右键菜单

    如今Bootstrap这个前端框架已被许多人接受并应用在不同的项目中,其中“开发高效,设备兼容”的特点表现得非常明显。这篇文章主要介绍了使用contextMenu插件实现Bootstrap table弹出右键菜单,需要的朋友可以参考下
    2017-02-02
  • 在JavaScript中获取请求的URL参数[正则]

    在JavaScript中获取请求的URL参数[正则]

    在ASP.NET后台代码中,对于这样的URL请求地址:http://www.abc.com?id=001,我们可以通过Request.QueryString["id"]的方法很容易的获取到URL中请求的参数的值,但是要在前台js代码中获取请求的参数的值,应该怎么做呢?
    2010-12-12
  • get(0).tagName获得作用标签示例代码

    get(0).tagName获得作用标签示例代码

    get(0).tagName可获得作用标签,下面是它的一个小应用,在学习js的朋友可以参考下
    2014-10-10
  • javascript parseInt 大改造

    javascript parseInt 大改造

    还隐约记得第一次遇到 parseInt这个诡异问题的时候,以为发现了IE的BUG,兴奋不已。
    2009-09-09
  • js中toString()与valueOf()的使用

    js中toString()与valueOf()的使用

    tostring 和 valueOf 函数是解决值的显示和运算的问题,本文主要介绍了js中toString()与valueOf()的使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • uni-app的iPhonex底部安全区域解决方案

    uni-app的iPhonex底部安全区域解决方案

    这篇文章主要为大家介绍了uni-app的iPhonex底部安全区域解决方案示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 模拟javascript中的sort排序(简单实例)

    模拟javascript中的sort排序(简单实例)

    下面小编就为大家带来一篇模拟javascript中的sort排序(简单实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论