V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cwz346852114
V2EX  ›  问与答

js 原型与原型链继承的关系有点没懂

  •  
  •   cwz346852114 · 2020-12-31 15:45:35 +08:00 · 1276 次点击
    这是一个创建于 1423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    class Person{

    }

    class Child extends Person{ xxx(){

    } class 中 方法是绑定在该类的原型上 Person 是 Child 的原型 为啥 Person 实例化对象无法调用 Child 上的 XXX 方法 有哪个大佬解释一下 感觉是我没弄懂 继承的问题。。。

    11 条回复    2020-12-31 19:37:24 +08:00
    cwz346852114
        1
    cwz346852114  
    OP
       2020-12-31 15:53:16 +08:00
    111
    cwz346852114
        2
    cwz346852114  
    OP
       2020-12-31 15:53:21 +08:00
    111222
    cwz346852114
        3
    cwz346852114  
    OP
       2020-12-31 15:59:09 +08:00
    Object.getPrototypeOf(child)的时候返回的原型是 Person 我在 Person 上面也找到了 xxx 这个方法 为啥父级直接没法调用
    murmur
        4
    murmur  
       2020-12-31 16:03:25 +08:00
    是我出现幻觉了么,child 继承 person,也应该说 child 的实例调用 person 的方法
    murmur
        5
    murmur  
       2020-12-31 16:03:52 +08:00
    class Person{
    test1(params) {
    console.log(111);
    }
    }

    class Child extends Person{
    test2(params) {
    console.log(222);
    }
    }

    var c = new Child();

    c.test2();
    c.test1();

    这样是没问题的
    cwz346852114
        6
    cwz346852114  
    OP
       2020-12-31 16:07:05 +08:00
    @murmur 我的意思是 父级实例化对象 调用子集里面的 xxx 方法
    murmur
        7
    murmur  
       2020-12-31 16:07:58 +08:00
    @cwz346852114 你去看看面向对象的思路,都是子类访问父类的方法,我还没听说过父类访问子类的方法
    1KN6sAqR0a57no6s
        8
    1KN6sAqR0a57no6s  
       2020-12-31 16:09:58 +08:00
    但凡你学过一点面向对象编程也问不出这么不着边际的问题,差的知识太多了,先看看基础吧
    zengzizhao
        9
    zengzizhao  
       2020-12-31 16:28:38 +08:00
    去看看 C++里的面向对象,从内存方面了解一下
    yanguoyu
        10
    yanguoyu  
       2020-12-31 17:52:14 +08:00
    难道要问的是类似 C++的虚函数,父类指针调用子类方法?
    Zhuzhuchenyan
        11
    Zhuzhuchenyan  
       2020-12-31 19:37:24 +08:00
    帮你分析下
    > class Person {}
    > class Child extends Person {test(){}}

    > Child.prototype.hasOwnProperty('test')
    True

    > let aChild = new Child()
    > aChild.__proto__ === Child.prototype
    True

    > aChild.__proto__.__proto__ === Person.prototype
    True

    这才是这根原型链的本来面貌,更具体的,对 Person 的实例化对象而言
    > let aPerson = new Person()
    > aPerson.__proto__ === Person.prototype
    True

    aPerson 的原型链中跳过了一个环节,将 Child.prototype 跳过了,从而 aPerson 中的原型链中不可能有 test 方法。
    扩展阅读
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1563 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:15 · PVG 01:15 · LAX 09:15 · JFK 12:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.