据我所知,JavaScript是基于原型而不是类的OOP,它不考虑接口,而是依赖于鸭子类型。
然而,我经常可以在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的理解。
发布于 2021-04-12 06:13:54
它不是一个可以实例化的带有构造函数的类,所以我们不称它为类。它也不是原型对象。
MDN在一般的OOP含义中使用术语interface,它不限于基于类的继承,而是指具有方法签名的类型定义。
然而,它也在Web接口定义语言的非常特定的上下文中使用了术语interface,web存储规范实际上使用了web接口定义语言来define Storage as an interface。这些WebAPI可以用多种语言实现(称为“绑定”),但JS最为常见。WebIDL规范甚至定义了how such an interface is to be represented in JavaScript ( "ECMAScript绑定“),特别是接口的线性继承是使用接口对象和它们的.prototype之间的原型继承实现的(基本上就像使用class Storage extends …一样)。这意味着localStorage instanceof Storage和Storage.prototype.hasOwnProperty('getItem')的工作方式与预期一致。
https://stackoverflow.com/questions/67050557
复制相似问题