正确使用JavaScript接口关键字

eri*_*2k8 9 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
  }
}
Run Code Online (Sandbox Code Playgroud)

一个纯粹人为的例子,但用这种方式命名"模块"是否反对惯用?

amb*_*odi 8

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

您的Math示例让我怀疑您正在讨论一种名为Module Pattern的设计模式,该模式广泛用于确定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;     
})();
Run Code Online (Sandbox Code Playgroud)

但这不是全部.其他选项包括Scoped模块模式,POJO模块模式等等.看看如何编写高度可扩展和可维护的JavaScript:模块,它有一个非常简单但非常全面的示例.

到目前为止,我们谈到了简单的Javascript.如果您能够在代码中使用库,那么可以使用诸如Requirejs,CommonsJS等令人惊奇的库来帮助您实现开箱即用的功能.看看Addy Osmani关于用AMD,CommonJS和ES Harmony编写模块化JavaScript的帖子.


mes*_*azs 5

interfacejavascript中的关键字是FutureReservedWord,因此尽管将来的规范可能会更改,但它现在绝对不执行任何操作。(请参阅ECMAScript 5.1,第7.6.1.2节)。在ES6草案中,这也是相同的。

对于您的模块,这是一个完美的惯用解决方案。“命名空间”函数始终是一个好主意,因为它可以使全局范围保持尽可能的干净。