正确使用JavaScript接口关键字

时间:2015-04-13 07:57:33

标签: javascript

首先,不,我没有尝试为我的JavaScript代码创建任何类似Java的界面。我已经看到了这些问题,虽然我仍然是JavaScript的相对新手,但是我的思绪在(IMO)对这个想法感到非常恐惧。

但是,我很好奇interface关键字的实际用途是什么。例如,Math是一个接口,包含定义(但不包含实现)。我相信(并且可能完全错误)这些是为语言的定义者提供一种方法来强制执行一系列要在各种JavaScript引擎中实现的行为。这是对的吗?

此外,我希望有一个静态课程"它包含一堆实用工具方法。我喜欢Math.sqrt(3)有一个外部命名空间(' Math'),它是大写的,并且有许多逻辑上类似的方法和值。也许只是我的Java / Ruby背景让我想要分组对象的资金。这是不好的形式?

var ShapeInspections = {
  isSymmetrical: function (s) {
    // determine if shape is symmetrical
  },
  numAngles: function (s) {
    // return the number of angles
  }
}

一个纯粹人为的例子,但命名"模块"是否具有反惯用性。这样吗?

4 个答案:

答案 0 :(得分:8)

好的,与其他答案一样,您知道关键字 interface 在Javascript世界中没有真正的用例。

您的 Math 示例让我怀疑您正在谈论一种名为模块模式的设计模式,广泛用于确定Javascript代码的范围。有许多方法可以使代码模块化。例如,就像OddDev回答你一样,着名的 Prototype Pattern 可以以模块化方式嵌入你的代码(就像你的 Math 示例一样)。以下是 Revealing Prototype Pattern 示例以及私有变量和函数,以提供额外的灵活性:

/* Example from: 
    http://www.innoarchitech.com/scalable-maintainable-javascript-modules */
var myPrototypeModule = (function (){

   var privateVar = "Alex Castrounis",
       count = 0;

   function PrototypeModule(name){
    this.name = name;
   }

   function privateFunction() {
      console.log( "Name:" + privateVar );
      count++;
   }

   PrototypeModule.prototype.setName = function(strName){
      this.name = strName;
   };

   PrototypeModule.prototype.getName = function(){
      privateFunction();
   };

   return PrototypeModule;     
})();

但并非全部。其他选项包括 Scoped模块模式 POJO模块模式等等。看一下How to Write Highly Scalable and Maintainable JavaScript: Modules,它有一套非常简单而又全面的例子。

到目前为止,我们谈到了简单的Javascript。如果您能够在代码中使用库,那么 Requirejs CommonsJS 等一系列令人惊叹的库可以帮助您解决这个问题。 开箱即用的 功能。看看Addy Osmani关于Writing Modular JavaScript With AMD, CommonJS & ES Harmony的帖子。

答案 1 :(得分:4)

javascript中的interface关键字是 FutureReservedWord ,因此它现在绝对没有任何内容,但可能会在未来的规范中发生变化。 (见ECMAScript 5.1, section 7.6.1.2)。在ES6草案中,这也是一样的。

至于你的模块,这是一个完美的惯用解决方案。 "命名空间"总是一个好主意。你的功能,因为它保持全球范围尽可能干净。

答案 2 :(得分:0)

  

我相信(并且可能完全错误)这些是为语言的定义者提供一种手段来强制执行在各种JS引擎中实现的一组行为。这是对的吗?

不,这不正确。像“数学”等的东西是包含函数的对象。如果您使用eyample“Math.pow(...)”,则只需执行存储在“Math”对象中的函数。检查此示例:

var Math = {};
Math.prototype.pow = function(){
 alert("stuff");
}
  

var ShapeInspections = {isSymmetrical:function(s){       //确定形状是否对称},numAngles:function(s){       //返回角度数}}一个纯粹人为的例子,但是这样命名“模块”是否具有反自觉性?

可以像这样命名你的对象。如前所述,“Math”也只是一个对象,遵循这些命名约定。

为接口关键字明确说明:

  

以下令牌也被视为FutureReservedWords   当它们出现在严格模式代码中时(见10.1.1)。发生   在任何上下文中的严格模式代码中的任何这些令牌   FutureReservedWord的出现会产生错误   也会产生一个等价的错误:

     

实现私有公共收益   接口包保护静态

它只是保留,因为将来需要“可能”。所以不要太担心它:) http://www.ecma-international.org/ecma-262/5.1/#sec-7.6

答案 3 :(得分:0)

不要混淆"接口" IDL中使用interface关键字指定的内容。

后者保留供将来使用,但尚未在ECMAScript中实际使用(即使在ES6中也没有)。