当前位置: 首页 > 知识库问答 >
问题:

javascript - js中的class继承怎么使用?

蓝逸仙
2023-12-17

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)            }        }

这样写可以么?

共有4个答案

楚宪
2023-12-17

类的成员方法尽量不要用箭头函数,如果用了箭头函数,那么成员是直接挂在实例上而不是原型属性上,这样函数就不能共用了。要访问父类的 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() {}}
颜均
2023-12-17

如果超类的 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)    }  }}
焦兴为
2023-12-17
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

丘畅
2023-12-17

在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