声明同名的静态和非静态方法时有什么陷阱吗?它适用于所有现代浏览器吗?一般来说,是否允许这样做?参见示例:
class User {
constructor() {
this.name = "Name";
this.surname = "Surname";
}
fi() {
return "this: " + [this.name, this.surname].join(" ");
}
static fi(user) {
return "static: " + [user.name, user.surname].join(" ");
}
}
user = new User;
console.log(user.fi());
console.log(User.fi(user));
this: Name Surname
static: Name Surname
理论上,它们有不同的存储位置和不同的继承链(参见https://javascript.info/static-properties-methods中的图表),所以不会有冲突,除了读者的头脑。一切都取决于情况。如果有混淆的危险,最好繁殖。
也许你被保留字误导了
static。在javascript中,它对静态方法是否成功没有影响。实际上在javascript中,原则上没有静态方法和非静态方法之分。方法本身与函数没有什么不同。任何函数都可以在对象的上下文中调用 - 有this或没有传递参数(即当 this === 未定义时)。在您的示例中,在第一种情况下,函数在 . 引用的对象的上下文中调用
user。而第二个——在对象的上下文中User。但这可以使用 call / apply 绕过: