我有一个静态方法的类:
class User {
constructor() {
User.staticMethod();
}
static staticMethod() {}
}
对于静态方法是否存在类似的情况(即,在没有实例的情况下引用当前类)。
this.staticMethod()
所以我不必写下课程名称' User'。
答案 0 :(得分:26)
来自MDN文档
静态方法调用直接在类上进行,而不是 可以在类的实例上调用。静态方法经常被用来 创建效用函数。
有关详情,请参阅=> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
你可以做这样的事情=> this.constructor.staticMethod());
调用静态方法。
class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticMethod());
// 'static method has been called.'
console.log(this.constructor.staticMethod());
// 'static method has been called.'
}
static staticMethod() {
return 'static method has been called.';
}
}
答案 1 :(得分:4)
代替此User.staticMethod(),您可以添加this.constructor.staticMethod()
答案 2 :(得分:3)
static
事物绑定到类而不是实例。所以你必须至少指定类名。
如果您不想将它们绑定到某个类,请将它们设为全局。
答案 3 :(得分:1)
将javascript中一个类的静态成员添加为类属性,您可以使用代码查看列表
console.log(Object.getOwnPropertyNames(PaymentStrategy));
并且仅用于访问成员
const memberFun = PaymentStrategy["memberName"];
//if member is a function then execute
memberFun();
//or
memberFun(data);
示例:
class PaymentStrategy{
static Card(user){
console.log(`${user} will pay with a credit card`);
}
static PayPal(user){
console.log(`${user} will pay through paypal`);
}
static BKash(user){
console.log(`${user} will pay through Bkash`);
}
}
export default PaymentStrategy;
import PaymentStrategy from "./PaymentStrategy";
class Payment{
constructor(strategy = "BKash"){
this.strategy = PaymentStrategy[strategy];
console.log(Object.getOwnPropertyNames(PaymentStrategy));
}
changeStrategy(newStratgey){
this.strategy = PaymentStrategy[newStratgey];
console.log(`***Payment Strategy Changed***`);
}
showPaymentMethod(user){
this.strategy(user);
}
}
export default Payment;
```
```
import Payment from "./Payment"
const strategyPattern = (()=>{
const execute = ()=>{
const paymentMethod = new Payment();
paymentMethod.showPaymentMethod("Suru");
paymentMethod.showPaymentMethod("Nora");
paymentMethod.changeStrategy("PayPal");
paymentMethod.showPaymentMethod("Rafiq");
}
return{
execute:execute
}
})();
export {strategyPattern}
```
答案 4 :(得分:0)
在@Ninjaneer接受的答案中:
class StaticMethodCall { constructor() {
console.log(StaticMethodCall.staticMethod());
// 'static method has been called.'
console.log(this.constructor.staticMethod());
// 'static method has been called.' }
static staticMethod() {
return 'static method has been called.'; } }
this.constructor.staticMethod()
将引发错误,因为您必须在访问构造函数中的this
之前调用超级构造函数。
假设您解决了上述问题,没有双关语,我认为调用this.constructor.staticMethod()
的唯一好处就是您不必依赖类的名称-如果它改变了。但是,这种好处可能微不足道,因为它仅有益于从类内部进行的静态方法调用。外部进行的静态方法调用必须类似于StaticMethodCall.constructor.staticMethod()
之类的方法,它无法达到目的并且看起来很傻。
摘要:
如果您打算在类之外使用静态方法,那么我肯定会坚持使用StaticMethodCall.staticMethod(),因为它更加惯用和简洁。
如果您仅打算在类中使用静态方法,则可以使用this.constructor.staticMethod()
,但这可能会使其他开发人员感到困惑并使他们回到此页面:-)
答案 5 :(得分:0)
我刚刚遇到了一个类似的问题(引用了超静态方法),在这里留下一个答案,以防其他人觉得它有用。
本质上,解决方案是将类本身传递给静态方法。例如:
class Foo {
static greet(Type) {
return `Hello, ${Type.name()}`
}
static name() {
return 'foo'
}
}
class Bar extends Foo {
static name() {
return 'bar'
}
}
现在你可以打电话了
Bar.greet(Bar) // returns 'Hello, bar'