- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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...
因为它不起作用,但您距离第一个落入该陷阱的人还远。 :-) 尝试添加 Car
的 LuxuryCar
子类来查看问题:现在 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!