gpt4 book ai didi

Javascript:类设计模式——伪多态

转载 作者:行者123 更新时间:2023-11-30 14:26:11 25 4
gpt4 key购买 nike

在 Kyle Simpson 的 You-Don't-Know-Js 系列丛书中,在 this & Object Prototypes 一书中讨论了 es6 之前的 javascript 中的类模式实现他在第 4 章中提到的系列 pseudo-polymorphism .

他描述这种伪多态性时说:

But because of JavaScript's peculiarities, explicit pseudo-polymorphism (because of shadowing!) creates brittle manual/explicit linkage in every single function where you need such a (pseudo-)polymorphic reference. This can significantly increase the maintenance cost. Moreover, while explicit pseudo-polymorphism can emulate the behavior of "multiple inheritance", it only increases the complexity and brittleness.

据我所知,这种伪多态性是一种我们最好避免的不良行为,因为它显式调用了 SUPER 类,就像在他关于调用 Vehicle 类来自 Car 类,所以我们可以像这样显式调用:

function Car () {
Vehicle.call( this );
}
//also overriding Vehicle's methods
Car.prototype.methodName = function( p1 ) {
//manipulate p1 then call the super method.
Vehicle.prototype.methodName.call( this, p1 );
};

但我想知道这里的问题是否与显式使用 Vehicle 类名有关,那么我们为什么不这样做:

function Car () {
this.super = Object.getPrototypeOf( this ).constructor;
this.super.call( this );
}
//also overriding Vehicle's methods
Car.prototype.methodName = function( p1 ) {
//manipulate p1 then call the super method.
this.super.prototype.methodName.call( this, p1 );
};

这种伪造或模拟其他面向类的语言中的 super 关键字是否可以解决问题?

最佳答案

...why we don't just do this...

因为它不起作用,但您距离第一个落入该陷阱的人还。 :-) 尝试添加 CarLuxuryCar 子类来查看问题:现在 this.super (即使在 Car code) 指的是 Car,而不是 Vehicle

有些模式可以避免在 ES5 级代码 (I wrote one of them up in 2009) 的 Car 中显式使用名称 Vehicle,但它们已经过时了现在;相反,我们使用 ES2015 中的 class 语法(必要时进行转译):

class Vehicle {
methodName() {
console.log("Vehicle#methodName");
}
}
class Car extends Vehicle {
methodName() {
super.methodName();
console.log("Car#methodName");
}
}
class LuxuryCar extends Car {
methodName() {
super.methodName();
console.log("LuxuryCar#methodName");
}
}

const l = new LuxuryCar();
l.methodName();

关于Javascript:类设计模式——伪多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com