• ES6 - 简单理解原型



    什么是原型?

    任何一个对象都具有一个原型对象,对象中有许多的属性和方法,这个对象可以使用它的原型上的所有方法


    原型的使用

    首先我们一定要有一个对象,这样的话才能使用它的原型对象:

    // 有一个用户对象
    
    const user = {
      name: '不知名用户',
      age: 22,
      hobby: ['跑步', '打代码', '打篮球', '穿背带裤', 'rap', '唱', '跳'],
    };
    
    // user的原型
    user.__proto__.run = () => console.log('跑起来了');
    
    user.run();
    
    // 跑起来了
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    OK,看起来并没有什么大用处 🤔

    我们接着往下看:

    上面的是我们通过对象的 __proto__ 获取,其实我们还有一种方法,就是通过构造函数的 prototype 属性拿到原型

    function User(name, age) {
      this.name = name;
      this.age = age;
    }
    
    const user = new User();
    
    User.prototype.run = () => console.log('Run');
    
    user.run();
    
    // Run
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    实例上虽然没有该方法,但是它的原型上有该方法,那么就可以进行调用


    类的原型

    在之前的博文中阐述过,这里就不做过多的阐述了,类中的原型通过类的 prototype 属性来获取,其实这就是一个继承了

    点击前往 => 类与面向对象


    实现基于原型的继承

    function Father() {
      this.run = function () {
        console.log('我跑起来了');
      };
    }
    
    function Son() {
      this.jump = function () {
        console.log('我只会跳');
      };
    }
    
    // 我们想要Son继承Father的跑的方法 --并且使用原型的继承
    
    Son.prototype = new Father();
    
    const son = new Son();
    
    son.run();
    
    // 我跑起来了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    原型链

    原型链其实就是这个对象的原型还有原型,它的原型还有原型…

    就像我们上面的例子一样,当我们使用对象方法的时候,会首先从最近或者说当前对象上找有没有这个方法,有就执行,如果没有的话,去原型上找,原型找到之后就执行,如果还是没有的话,那么会继续去原型的原型上找,直到找到为止,没有的话就报错

    等等,那么找到什么地方才算是找不到呢?或者说找到什么时候才算是个头呢?最终其实会找到我们的 Object 对象的原型

    这就有一个有趣的现象了,如果我们只给到了Object 原型一个方法,那么只要是个对象且在原型链中找不到对应方法,那么就会去执行我们的object原型上的方法,什么意思呢?我们上代码演示一下:

    Object.prototype.run = () => console.log('我尽然能在Object对象原型上跑起来 🤨');
    
    const a = [];
    
    a.run();
    
    // 我尽然能在Object对象原型上跑起来 🤨
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    OK,这也证实了只要是个对象,那么它的原型链顶端就是 Object 对象的原型

  • 相关阅读:
    K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序
    数据可视化图表之面积折线图
    OpenWrt 20.02.2 小米路由器3G配置CP1025网络打印
    Spring 事务失效的八种场景
    Maven Helper 安装使用
    Python的高级用法:偏函数
    matlab神经网络训练方法,matlab神经网络训练图
    selenium判断元素可点击、可见、可选
    共享模型之管程
    ica1靶机(hydra爆破)
  • 原文地址:https://blog.csdn.net/weixin_63836026/article/details/126306678