cwz346852114
V2EX  ›  问与答

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

  •  
  •   cwz346852114 · Dec 31, 2020 · 2169 views
    This topic created in 1974 days ago, the information mentioned may be changed or developed.

    class Person{

    }

    class Child extends Person{ xxx(){

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

    11 replies    2020-12-31 19:37:24 +08:00
    cwz346852114
        1
    cwz346852114  
    OP
       Dec 31, 2020
    111
    cwz346852114
        2
    cwz346852114  
    OP
       Dec 31, 2020
    111222
    cwz346852114
        3
    cwz346852114  
    OP
       Dec 31, 2020
    Object.getPrototypeOf(child)的时候返回的原型是 Person 我在 Person 上面也找到了 xxx 这个方法 为啥父级直接没法调用
    murmur
        4
    murmur  
       Dec 31, 2020
    是我出现幻觉了么,child 继承 person,也应该说 child 的实例调用 person 的方法
    murmur
        5
    murmur  
       Dec 31, 2020
    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
       Dec 31, 2020
    @murmur 我的意思是 父级实例化对象 调用子集里面的 xxx 方法
    murmur
        7
    murmur  
       Dec 31, 2020
    @cwz346852114 你去看看面向对象的思路,都是子类访问父类的方法,我还没听说过父类访问子类的方法
    1KN6sAqR0a57no6s
        8
    1KN6sAqR0a57no6s  
       Dec 31, 2020
    但凡你学过一点面向对象编程也问不出这么不着边际的问题,差的知识太多了,先看看基础吧
    zengzizhao
        9
    zengzizhao  
       Dec 31, 2020
    去看看 C++里的面向对象,从内存方面了解一下
    yanguoyu
        10
    yanguoyu  
       Dec 31, 2020
    难道要问的是类似 C++的虚函数,父类指针调用子类方法?
    Zhuzhuchenyan
        11
    Zhuzhuchenyan  
       Dec 31, 2020
    帮你分析下
    > 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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   949 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 21:42 · PVG 05:42 · LAX 14:42 · JFK 17:42
    ♥ Do have faith in what you're doing.