js中的class继承怎么使用?
父类Parent中有个fetch函数,我想再次包装下,只对入参做些修改,其他的全部继承父类,但是一直失败
class Parent { constructor() { } fetch = (data) => { console.log(1, data) } }class Child extends Parent { constructor(props) { super(props) } fetch = (data) => { if (data) { data.name = 'test' } console.log(2, data) return super.fetch(data) } }
Parent
是个组件fetch
是箭头函数尽量不做修改,上面这种写法会报错super.fetch is not afunction
,原因是super
不支持在箭头函数中使用,但是改成常规写法
fetch() {}
这种方式又没法重写Parent
中的fetch
函数,请问这种情况该怎么处理?
class Child extends Parent { constructor(props) { super(props) } fetch = (data) => { if (data) { data.name = 'test' } const item = new Parent() return item.fetch(data) } }
这样写可以么?
类的成员方法尽量不要用箭头函数,如果用了箭头函数,那么成员是直接挂在实例上而不是原型属性上,这样函数就不能共用了。要访问父类的 fetch,自然需要先获取到父类的实例才能访问。
class People { name = 'people'}class Child extends People { say() {} say2 = () => { }}
class People { constructor() { _defineProperty(this, "name", 'people'); }}class Child extends People { constructor(...args) { super(...args); _defineProperty(this, "say2", () => {}); } say() {}}
如果超类的 fetch
方法内部没有引用 this
,那么你的方法就可行。
不过,即便fetch
方法内部引用了this
,你也可以观察其引用了this
的哪些属性,然后把this
的这些属性同步给作为工具人的new Parent
。
只不过这可能给项目埋雷,因为如果上游有变化,下游也得跟进改动,不然可能出 Bug 。
我提供一种比较野的思路,在实例化完成之后,再覆盖对应属性:
class Sub extends Parent { constructor(...args){ super(...args) // 获取由超类初始化的 fetch const { fetch } = this; // 覆盖此属性 this.fetch = (data) => { data.name = "hacked"; return fetch.call(this, data) } }}
class Parent { constructor() {} fetch = (data) => { console.log(1, data); };}class Child extends Parent { constructor(props) { super(props); this.parent = new Parent(); } // 改写 fetch = ((superfetch) => (data) => { if (data) { data.name = "test"; } console.log(2, data); superfetch(data); })(this.fetch);}
做了修改,应该可以满足你的方式。
参考的 => https://stackoverflow.com/a/52823577/10378232
在JavaScript中,当子类(Child)需要重写父类(Parent)的方法时,仍然想要调用父类的方法,通常可以通过super
关键字来实现。你的代码中出现错误的原因是在箭头函数中无法正确地调用super
。在类的构造函数中,你可以使用常规函数来定义fetch
方法,这样就可以正确地调用super.fetch
了。
以下是修改后的代码:
class Parent { constructor() { } fetch() { console.log(1, this.data) } }class Child extends Parent { constructor(props) { super(props) } fetch(data) { if (data) { data.name = 'test' } console.log(2, data) return super.fetch(data) }}
在这段代码中,fetch
方法被定义为常规函数,并且可以正确地调用super.fetch(data)
。注意,这里需要将fetch
方法的参数传递给父类的fetch
方法。另外,由于在子类中对fetch
方法进行了修改,因此需要将data
参数传递给父类的fetch
方法。这样就可以在重写父类方法的同时,仍然能够调用父类的方法。
在上面的章节中我们看到了JavaScript的对象模型是基于原型实现的,特点是简单,缺点是理解起来比传统的类-实例模型要困难,最大的缺点是继承的实现需要编写大量代码,并且需要正确实现原型链。 有没有更简单的写法?有! 新的关键字class从ES6开始正式被引入到JavaScript中。class的目的就是让定义类更简单。 我们先回顾用函数实现Student的方法: function Student
本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介 在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以
本文向大家介绍JS继承之借用构造函数继承和组合继承,包括了JS继承之借用构造函数继承和组合继承的使用技巧和注意事项,需要的朋友参考一下 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数。
本文向大家介绍JavaScript 类继承,包括了JavaScript 类继承的使用技巧和注意事项,需要的朋友参考一下 示例 继承的工作方式与其他面向对象的语言相同:在超类上定义的方法可在扩展子类中访问。 如果子类声明了自己的构造函数,则它必须先通过调用父构造函数,super()然后才能进行访问this。
问题内容: 我已经阅读了很多有关javascript中“继承”的文章。其中一些使用,而另一些则建议。我读得越多,我就越困惑,因为它似乎存在着无穷无尽的变体来解决继承问题。 有人可以告诉我最可接受的方式吗(如果有的话,是事实上的标准)吗? (我想要一个可以扩展或的基础对象。) 问题答案: 简单:并非在所有环境中均受支持,但可以填充。除此之外,两者具有不同的目的:只需创建一个对象从其他继承,同时 还
本文向大家介绍浅谈JS继承_寄生式继承 & 寄生组合式继承,包括了浅谈JS继承_寄生式继承 & 寄生组合式继承的使用技巧和注意事项,需要的朋友参考一下 5.寄生式继承 与寄生构造函数和工厂模式类似,创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。 在上述例子中,createAnother函数接收了一个参数,也就是将要作为新对象基础的对象。 anotherPerso