【问题标题】:Implementing interfaces in JavaScript在 JavaScript 中实现接口
【发布时间】:2015-07-18 14:26:17
【问题描述】:

我正在学习 JavaScript。我的背景传统上是 Java 和 C#。在那些环境中,我可以使用接口。很多时候,我的模式看起来像这样:

var implementers = GetForInterface<ISomeInterface>();

foreach (var implementer in implementers)
  {
  implementer.SomeMethod();
  }

我的问题是,我如何在 JavaScript 中做类似的事情?我似乎无法弄清楚的主要事情是GetForInterface 部分。我不确定这种设计模式叫什么。

谢谢

【问题讨论】:

  • 我认为您正在寻找将原型继承用于伪类(您知道它在 JavaScript 中不存在的类和继承)
  • 首先,在 JavaScript 中真的没有什么能比得上“接口”。不要试图让 JavaScript 看起来或表现得像你知道的其他语言,尤其是 Java 或 C#。
  • 这段代码是用什么语言剪辑的?它看起来不像是有效的 Java,所以我猜它是 C#?更重要的是:它应该做什么以及什么时候需要它?我们或许可以建议一种可在 JavaScript 中使用的替代模式。

标签: javascript design-patterns interface porting


【解决方案1】:

Javascript 中没有接口,

您所说的设计模式是服务定位器,但通常这不是 javascript 的方式。

您可以使用一些库来执行此操作:service-locator 或使用类和继承自行实现。

一个简单的例子是保存一个从同一个类继承的实例数组,你将能够循环它们(并根据需要为所有实例激活相同的方法)

【讨论】:

  • 很好的答案,除了 JS 也没有真正的类......是的,我知道“类”即将出现在 ES6 中,但它们只是原型之上的语法糖。所以说“继承自同一个prototype的实例”会更准确。
  • 你可以使用函数和原型来实现'类'(使用new关键字)和继承,你不需要使用ES6的特性
  • 我的意思是它们仍然不是真正的类。语义与基于类的语言完全不同。
  • 我同意你的看法。 :)
【解决方案2】:

我见过的最简单的方法是使用存根并根据需要覆盖它们。例如:

     function getter(obj){}

     function objChecker()
       {
       try
         {
         /* Check argument length and constructor type */
         if (getter.length === 1 && getter.constructor === Function)
           {
           console.log("Correct implementation");
           return true;
           }
         else
           {
           console.log("Wrong implementation");
           return false;
           }
         }
       catch(e)
         {
         return NaN;
         }
       finally
         {
         console.log(JSON.stringify(getter))
         }
       }
 
 getter = getter;
 objChecker();
 getter = [];
 objChecker();
 getter = {};
 objChecker();
 getter = RegExp;
 objChecker();
 getter = Function;
 objChecker();

参考文献

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2013-05-10
    • 2017-06-22
    • 2018-07-25
    • 2012-02-01
    相关资源
    最近更新 更多