Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以在子类ES 2015的实例中调用重写的方法吗?

可以在子类ES 2015的实例中调用重写的方法吗?
EN

Stack Overflow用户
提问于 2019-10-25 08:53:02
回答 4查看 859关注 0票数 1

最近,在查看技术面试问题时,我看到了一个类似的问题,这让我在JavaScript中更普遍地考虑了对象继承。

下面是一些简单的代码:

代码语言:javascript
运行
AI代码解释
复制
class Car {
  constructor(make,model) {
    this.make = make
    this.model = model
  }

  emitsCarbon() {
    return true
  }

}

class Hybrid extends Car {
  constructor(...args) {
    super(...args)
  }
  emitsCarbon() {
    return false
  }
}

let car1 = new Hybrid('toyota', 'prius')

car1.emitsCarbon() // returns false

我想知道的是,是否有一种方法可以在子类的实例中调用返回true (从父类)的原始emitsCarbon()方法?

我的假设是“不”,一旦它被重写,我将不得不在car1实例中再次重写该方法,以便在调用函数时使其返回true。

我试图填补的知识不足是:在JavaScript中,是否可以在类继承中引用备份级别并查看所有父类属性(方法等)。给定子类的实例。在其他语言(例如java)中,这似乎是可能的,但是,我对这些语言的经验并不多。

最后,这是否有用,即是否应该更小心地覆盖不应该被覆盖的属性,我不太确定。但是,更好地理解在类和类继承层次结构中向上移动是很有用的。

这不是:如何从javascript中的子类调用父方法?的副本。

我理解子类中父方法的调用,但是,我不理解子实例中父方法的调用(如果可能的话)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-25 09:08:49

我是JavaScript,所以你可以。无论如何,没有类,只是原型继承,上面有一些语法糖。

你想打哪一个电话:Car's emitsCarbon?那就是

代码语言:javascript
运行
AI代码解释
复制
Car.prototype.emitsCarbon.call(car1);

您的对象的类“直接祖先类”通常是emitsCarbon吗?

代码语言:javascript
运行
AI代码解释
复制
car1.__proto__.__proto__.emitsCarbon.call(car1);

(您不应该直接访问__proto__,但是除了一般的良好实践和指南之外,没有什么能真正阻止您)。

此外,混合动力车也会排放碳。只是个副词而已。

票数 2
EN

Stack Overflow用户

发布于 2019-10-25 08:58:51

我不敢相信这不是一个复制,但我找不到它(所有现有的Q/A处理旧的构造函数),所以.

只需使用super

代码语言:javascript
运行
AI代码解释
复制
class A {
  foo () {
    return 0;
  }
}

class B extends A {
  foo () {
    return 1;
  }

  bar () {
    return super.foo();
  }
}

const b = new B();
b.foo() // 1
b.bar() // 0

有一些限制,使用super不会允许您修改只读属性.

有关更多细节,请参见MDN文章

票数 0
EN

Stack Overflow用户

发布于 2019-10-25 09:08:12

当您可以修改子类时,另一个答案是很好的。

但是,由于最初的文章提到'...instance of子类‘,而不是’给定子类‘,那么即使不能使用<ParentClass>.prototype.<methodName>修改子类,也可以这样做。

代码语言:javascript
运行
AI代码解释
复制
class A {
  foo () {
    return 0;
  }
}

class B extends A {
  foo () {
    return 1;
  }
}

let b = new B();
console.log(b.foo()); // 1
console.log(A.prototype.foo()); // 0

对于需要this上下文的方法,请使用call调用。

代码语言:javascript
运行
AI代码解释
复制
class A {
  constructor(f) {
    this.f = f;
  }

  foo(ff) {
    return this.f + ff + 1;
  }
}

class B extends A {
  foo(ff) {
    return this.f + ff + 2;
  }
}

let b = new B(10);
console.log(b.foo(5)); // 17
console.log(A.prototype.foo.call(b, 5)); // 16

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58562698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档