【问题标题】:how to call an instance method inside a static method?如何在静态方法中调用实例方法?
【发布时间】:2020-10-30 23:05:03
【问题描述】:

我知道我们通常如何调用类的常规方法或类的静态方法,但我刚刚意识到我不知道如何在静态方法中调用类的常规方法:|

类似的东西

module.exports = class Notification {
  parsing_html(order) {
   // some parsing
  }


  static async send_notification(_id){
    const order = await Order.findOne({ _id });
    this.parsing_html(order);
  }
};

我用this算了,还是不行。

我在这里错过了什么?

提前感谢您的任何帮助/建议。

【问题讨论】:

  • 您不能从静态方法调用实例方法。并非没有实际的实例。根据定义,静态方法与任何一个实例都不相关。为什么这种方法完全是静态的?好像那是错的。要么,要么parsing_html 应该是静态的。
  • @VLAZ 知道了,谢谢 :D 我在玩,只是想尝试一下,但谷歌搜索后没有得到任何东西:|
  • 那我建议复习一下什么是静态方法。你试图做的事情基本上是不可能的。再一次,不是没有改变你真正想做的事情。如果Notification 是单例,或者您可以获得对象的实例,那么您可以在静态方法调用中使用它。或者你总是可以实例化对象,但那会是代码味道,表明设计或界面是错误的。
  • 解决此问题的一种方法是致电new this().parsing_html(order)。但是,这是不好的做法,如果构造函数需要参数,则不起作用。

标签: javascript class methods


【解决方案1】:

在运行时的 javascript 中,没有“实例方法”或“静态方法”之类的东西。整个类/静态语法只是一个简写。 Javascript OOP 基于原型和构造函数。

class Abc {
   constructor() { ..constructor code.. }
   test() { ... }
   static staticTest() { ... }
}

只是以下的简写/更直观的语法:

function Abc() { ..constructor code.. }
Abc.prototype.test = function() { ... }
Abc.staticTest = function() { ... }

两个代码在运行时完全相同。

因此,您始终可以从代码中的任何位置调用Notification.prototype.parsing_html。但是有一个问题:关键字this 将始终引用调用该方法的对象(点之前的对象,另请参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this),箭头函数除外。在这种情况下,Notification.prototype 将是 this 用于可能导致意外行为的函数调用。您可以使用callapply 来设置this 是什么:Notification.prototype.parsing_html.call(yourThisObject, order);

module.exports = class Notification {
  parsing_html(order) {
   // some parsing
  }

  static async send_notification(_id){
    const order = await Order.findOne({ _id });
    Notification.prototype.parsing_html(order); 
  }
};

【讨论】:

  • 在运行时没有“实例方法”或“静态方法”之类的东西” - 那么你如何调用实例和方法可用的方法存在于类对象(构造函数)本身上?
  • 这真的是你的观点问题。我会根据我想要的方式称它们为“静态方法”和“实例方法”。但它们实际上只是方法。它们的工作方式完全没有区别。考虑一下:class A { instanceMethod() { console.log("A") } } A.sameMethod = A.prototype.instanceMethod; new A().instanceMethod(); A.sameMethod(); 你怎么称呼那个方法?它既是实例又是静态方法。
  • 他们就是我们所说的。引用A.sameMethod 是静态方法,(new A).instanceMethod 是实例/原型方法。当然,它们都解析为同一个函数对象,但“方法”不止于此。
  • 没错。它是你如何使用它以及它实际上是什么使它成为一个实例方法。你所说的静态方法其实是构造函数的实例方法,因为构造函数是Function extends Object的实例。这取决于您在 javascript 中的观点。这与它在 Java / C# 等 OOP 语言中的工作方式根本不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多