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

2020-12-31 15:45:35 +08:00
 cwz346852114

class Person{

}

class Child extends Person{ xxx(){

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

1281 次点击
所在节点    问与答
11 条回复
cwz346852114
2020-12-31 15:53:16 +08:00
111
cwz346852114
2020-12-31 15:53:21 +08:00
111222
cwz346852114
2020-12-31 15:59:09 +08:00
Object.getPrototypeOf(child)的时候返回的原型是 Person 我在 Person 上面也找到了 xxx 这个方法 为啥父级直接没法调用
murmur
2020-12-31 16:03:25 +08:00
是我出现幻觉了么,child 继承 person,也应该说 child 的实例调用 person 的方法
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
2020-12-31 16:07:05 +08:00
@murmur 我的意思是 父级实例化对象 调用子集里面的 xxx 方法
murmur
2020-12-31 16:07:58 +08:00
@cwz346852114 你去看看面向对象的思路,都是子类访问父类的方法,我还没听说过父类访问子类的方法
1KN6sAqR0a57no6s
2020-12-31 16:09:58 +08:00
但凡你学过一点面向对象编程也问不出这么不着边际的问题,差的知识太多了,先看看基础吧
zengzizhao
2020-12-31 16:28:38 +08:00
去看看 C++里的面向对象,从内存方面了解一下
yanguoyu
2020-12-31 17:52:14 +08:00
难道要问的是类似 C++的虚函数,父类指针调用子类方法?
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740674

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX