MDN中的JavaScript接口

11
据我所知,JavaScript基于原型而不是类的面向对象编程,并不考虑接口,而是依赖于鸭子类型。然而,我经常在MDN在线文档中看到一些被描述为“接口”的对象,比如这里的Storage。

https://developer.mozilla.org/en-US/docs/Web/API/Storage

的确,window.Storage 存在且是一个函数,但它既不是构造函数也不是工厂函数,如果被调用就会失败。它没有像页面中描述的那样的成员,而是像 window.localStorage 一样具有这些成员。

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

将window.Storage作为window.localStorage访问的对象。我知道window.localStorage是一个原生对象,但我想了解window.Storage的作用,以及为什么MDN将其称为“接口”,在什么意义上:它是浏览器开发人员遵循的规范,而不是类基范例中所预期的严格“接口”吗?

提前感谢,抱歉问题有点奇怪。只是试图加深对ES的理解。


2
问:为什么“扭曲”术语适用于其他不同的语言?为什么不只是学习和理解JS自己的术语?书籍推荐:JavaScript: The Good Parts, Douglas Crockford。另外,考虑熟悉一下TypeScript - paulsm4
2
@paulsm4为什么不仔细阅读问题呢? - Jonas Wilms
1
@paulsm4 你是不是想评论另一个问题? - Bergi
3
“这是浏览器开发者遵循的规范吗?”确切地说,您会在Web规范中找到相同类型的接口。 - Jonas Wilms
1
我确实“理解JS的本质”,这就是为什么我不理解在一个结构上和哲学上都无法强制执行这样的构造的语言中的“接口”。 TypeScript不是JavaScript,也与问题本身无关。谢谢你的回答。 - Nillus
1个回答

10
这不是一个带有构造函数的类,因此我们不称之为类。它也不是原型对象。
MDN使用术语接口来表示通用面向对象编程(OOP)的含义,它不仅限于基于类的继承,还指代具有方法签名的类型定义。
然而,Web 存储规范确实使用 接口 这个术语来指代 Web 接口定义语言中的非常具体的上下文,这个语言用于将 Storage 定义为一个 接口。这些 WebAPI 可以用多种语言(称为“绑定”)实现,尽管 JS 是最常见的。WebIDL 规范甚至定义了如何在 JavaScript 中表示这样的接口(即“ECMAScript 绑定”),特别是使用原型继承在接口对象及其 .prototype 之间实现接口的线性继承(基本上就像使用 class Storage extends …)。这意味着 localStorage instanceof StorageStorage.prototype.hasOwnProperty('getItem') 的效果与预期相同。

这是针对那些接口对象没有定义constructor的接口如何工作的。规范说明:未使用构造函数操作声明其接口的接口对象在被调用时将会抛出异常,无论是作为函数还是构造函数。 - Jankapunkt
2
@Jankapunkt 这意味着你不能自己调用new Storage()或者Storage(),但是浏览器创建的“实例”仍然会从Storage.prototype继承。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接