【问题标题】:What's the difference between an interface and a constructor function in javascript?javascript中的接口和构造函数有什么区别?
【发布时间】:2015-09-09 06:23:13
【问题描述】:

我在阅读this SO question about using EventTarget,被这条评论弄糊涂了

EventTarget 只是一个接口,而不是构造函数。此外,您不能从原生 DOM 结构继承

我认为接口就是 W3C 所称的 javascript“类”。
另外,如果我尝试从 chrome 开发工具控制台中的 DOM Node 函数实例化一个新对象,

var myNode = new Node();

返回错误

未捕获的类型错误:非法构造函数

我知道经典 OOP 中的 in interface 是什么,但我的问题是构造函数和 javascript 中的 NodeEventTarget 等接口有什么区别?

【问题讨论】:

标签: javascript


【解决方案1】:

DOM 接口是在 JavaScript 之外定义的,因为 DOM 可以用多种语言操作(曾经有一段时间 VBScript 和 Tcl 可以在 JavaScript 之外的浏览器中使用),这就是 W3C 的 DOM 规范与语言无关的原因, DOM 本质上与 JavaScript 没有任何关系。

在跨平台/跨语言 API 中,接口是用 IDL(接口描述语言)之类的语言定义的,这里是定义 EventTarget(Webkit 使用)的 IDL:https://github.com/adobe/webkit/blob/master/Source/WebCore/dom/EventTarget.idl

JavaScript 本身没有接口的概念(与 C#/Java interface 相同的概念),因为它是一种原型语言,它使用 Duck 类型代替静态类型的接口,

JavaScript“类”是 ECMAScript 6 中的一个新特性(JavaScript 规范的下一个主要修订版),但是它可以被视为语法糖,以简化从相同原型构造函数创建实例的过程,它们也是与此界面概念不同。

总结:

API接口

语言界面

  • 是一种语言的特性(interface 在 Java 或 C# 中,__interface 在 Microsoft Visual C++ 中,protocol 在 Swift 和 ObjectiveC 中)
  • JavaScript 在其语言中没有概念,因为它是原型范式语言(因此使用 Duck 类型代替)
  • 假设语言支持,IDL 对象通常可以在语言的 interface 功能中以 1:1 的比例表示

【讨论】:

  • 谢谢,这是有道理的,所以基本上NodeEventTarget 是“API 接口”而不是语言接口(它们不能是每个 javascript 语言)它们只能由解释器本身实现,并且不能供开发者直接使用?
  • @user4668401 不完全是。您可以定义自己的 JavaScript 对象,这些对象也实现了 EventTarget(通过拥有 addEventListenerremoveEventListenerdispatchEvent 成员函数),然后满足将它们传递给任何其他函数的要求还需要 EventTarget 的函数(就像 EventTarget 语言 interface 对象一样)。
  • 然而,这些 IDL 接口通常是 JavaScript 引擎作者(特别是 DOM 实现者)而不是针对它们的程序员所关心的。
  • 顺便说一句,“ECMAScript 6”又名“ECMAScript 2015”或“ECMA-262 ed 6”是当前标准,而不是下一个标准。下一个计划是“ECMAScript 2016”,但我们必须拭目以待……;-)
猜你喜欢
  • 1970-01-01
  • 2019-09-17
  • 2012-05-07
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多