最近,在查看技术面试问题时,我看到了一个类似的问题,这让我在JavaScript中更普遍地考虑了对象继承。
下面是一些简单的代码:
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中的子类调用父方法?的副本。
我理解子类中父方法的调用,但是,我不理解子实例中父方法的调用(如果可能的话)。
发布于 2019-10-25 09:08:49
我是JavaScript,所以你可以。无论如何,没有类,只是原型继承,上面有一些语法糖。
你想打哪一个电话:Car
's emitsCarbon
?那就是
Car.prototype.emitsCarbon.call(car1);
您的对象的类“直接祖先类”通常是emitsCarbon
吗?
car1.__proto__.__proto__.emitsCarbon.call(car1);
(您不应该直接访问__proto__
,但是除了一般的良好实践和指南之外,没有什么能真正阻止您)。
此外,混合动力车也会排放碳。只是个副词而已。
发布于 2019-10-25 08:58:51
我不敢相信这不是一个复制,但我找不到它(所有现有的Q/A处理旧的构造函数),所以.
只需使用super
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文章。
发布于 2019-10-25 09:08:12
当您可以修改子类时,另一个答案是很好的。
但是,由于最初的文章提到'...instance of子类‘,而不是’给定子类‘,那么即使不能使用<ParentClass>.prototype.<methodName>
修改子类,也可以这样做。
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
调用。
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
https://stackoverflow.com/questions/58562698
复制