【JavaScript面试题】JS中的几种继承方法

作者: 码上通天分类: 校园学习 发布时间: 2022-04-04 19:29:37 浏览:12232 次

【JavaScript面试题】JS中的几种继承方法

Yqb凡尘:
不知道有没有人对原型链继承时子类在继承过程中不能传参有过疑惑?比如:Child.prototype = new Parent(arr); 全网口径一致的说是不能传参,但是当你真的去传的时候是没有任何问题,并且可以实现,而且可以传多个,毕竟说到底父类构造函数 Parent就是一个函数,怎么可能不能传参呢。所以应该把“不能”改成不建议,甚至说是传参危险性极大。因为一旦这个参数是个引用类型,那么就是一瓶毒药,会扩散到每一个被继承的子类中,所有继承者们都被影响。 回头梳理一下:本来你是来简单的继承我的属性和方法,我有啥你就用,不用就拉倒,结果你倒好,上来就强制给一个东西并且要求大家跟你一起变,这不是造反吗?因此出现了构造函数继承(但是它的缺点就是摸不到父类的原型,只能在父类中打注意)

【回复】全网的意思应该是,在创建子类实例的时候,不能赋给父类构造器参数,因为子类实例被创建的时候只能给子类构造器传参数,而继承关系是通过a.prototype = new b()实现的。像你这么写不是传参,只是写了一个常量。我是这么理解的。
小哈_么么哒:
请问在寄生组合继承中,父类原型链上若存在引用类型数据不还是会被污染吗?

【回复】因为使用了构造函数父类构造函数为自己添加属性,相当于自己也有了自己的属性,而不是通过原型链找父类的属性,所以并不是共享属性。(虽然你应该早懂了)
【回复】回复 @夜寞冷灯 :你去日本干嘛了
【回复】我按照你的说法试了一下,确实还是会被污染,你现在搞懂了吗?
这个是传说中的b站:
寄生组合继承中,为什么要一个中转的F构造函数和实例,直接用Student.prototype = Person.prototype 有什么影响?或者说造成的问题是什么?

【回复】你这个其实是将Student的原型赋为Person的原型,把爷爷当爸爸了emmmm
【回复】那这样Student构造的新对象的原始对象constructor就变成Person函数了
【回复】父子原型指向相同互相影响,通过fn过渡,生成的是包含父亲原型的副本
__阿凯_:
那为什么不直接 把student的原型指向person 的原型

【回复】也是可以的哈 寄生组合继承的原理是:将子类的prototype属性指向父类prototype属性, 然后子类就继承了父类原型上的属性(方法也是属性)。通过父类构造函数的call方法继承父类的属性,这些属性会被实例独享
天真无邪陈老魔:
探讨一下,组合继承那里,父类构造函数调用了两次或对象占据了两份内存这个说法是错误的。首先,js代码从上往下执行所以,Student.prototype = new Person() 只会执行一次,所以父类构造函数调用了两次是错误的;其次,原型对象只会有一个,所有实例的原型都是指向同一个对象,所以在内存中确实会多占据一点空间用来存放(name, eats, getName),但整个内存中仅此一份,所以实例都会占据两份内存这个说法是错误的;最后,拓展一下,原型对象所占据的内存大小不会影响实例的大小,因为是引用,是一个地址值,在固定设备上一个地址值的大小是一样的,比如:64 位的机器上只会占据 8个字节,所以实例对象所占据的内存大小是一样的;综上,组合继承相对还行,是可用的,现今的计算机内存空间都是很大,浪费个十几二十个字节而造成的影响完全可以忽略不计,当然最好还是用 es6 的语法,要兼容 es5 直接使用 Babel 就好了

【回复】组合继承,call的时候也执行了一次吧。。。,
【回复】回复 @一只小伊布 :楼主说的是组合继承,你说得call是借用继承,才会调用两次。组合最大缺点是原型背景穿透,借用最大的缺点是要求频繁通过call调用构造函数,而且因为要继承公有方法,所以所有方法要写在构造函数内浪费内存,又没有办法把函数原型的所有方法copy下来(其实有,但是麻烦要迭代),所有组合寄生是最好的,但是还是要构建寄生继承函数,object.create方法可以解决这个问题
【回复】回复 @一只小伊布 :Person.call只是执行了Person这个构造函数,难道还可以执行函数外的代码?
哈哈怪1:
get = () => { console.log('Person.prototype上的方法'); }; 为啥我在编辑器内置的浏览器上这句话会报错,谷歌上却能执行

【回复】get这个变量不要随意使用,定义对象的writable特性
Haleloy:
原型链继承为什么无法向父类构造函数传参呢

【回复】懂了,父类实例可以,子类实例不行
伊山侯:
已经三连支持,千万不用放弃更新。[打call]

_我是强啊强:
你用这个组合寄生还不如用新方法obejct.create()来操作更方便

校园分享官 编程 面试 JS 前端 JAVASCRIPT WEB前端 打卡挑战 必剪创作 校园分享官第2期

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读