JavaScript是否具有接口类型(例如Java的“接口”)?

JavaScript是否具有接口类型(例如Java的“接口”)?,第1张

JavaScript是否具有接口类型(例如Java的“接口”)?

没有“此类必须具有这些功能”的概念(也就是说,本身没有接口),因为:

  1. Javascript继承基于对象,而不是类。除非您意识到:这不是什么大不了的事情
  2. Javascript是一种 非常 动态的类型化语言-您可以使用适当的方法创建对象,这将使其符合接口, 然后取消定义 使其符合要求的 所有内容 。颠覆类型系统非常容易-甚至偶然!-首先尝试创建类型系统是不值得的。

相反,Javascript使用所谓的鸭子类型。(就JS而言,如果它像鸭子一样行走,而像鸭子一样嘎嘎叫,那就是鸭子。)如果对象具有quack(),walk()和fly()方法,则代码可以在期望的任何地方使用它一个可以走路,嘎嘎和飞起来的对象,而无需实现某些“可插入”接口。接口恰好是代码使用的一组函数(以及这些函数的返回值),通过鸭子输入,您可以免费获得它。

现在,这并不是说,如果您尝试调用,您的代码不会中途失败

some_dog.quack()
。您将收到TypeError。坦白说,如果您要让狗嘎嘎叫,那您的问题就会大一些。可以说,当您将所有鸭子连续放置时,鸭子打字最有效,除非您将它们视为普通动物,否则不要让它们混在一起。换句话说,即使界面是流畅的,它仍然存在。将狗传递给期望它一开始就发出嘎嘎叫声的代码通常是错误的。

但是,如果您确定自己做的正确,则可以在尝试使用特定方法之前测试是否存在特定方法,从而解决嘎嘎狗问题。就像是

if (typeof(someObject.quack) == "function"){    // This thing can quack}

因此,您可以在使用前检查所有可以使用的方法。但是,语法有点丑陋。有一种更漂亮的方法:

Object.prototype.can = function(methodName){     return ((typeof this[methodName]) == "function");};if (someObject.can("quack")){    someObject.quack();}

这是标准的Javascript,因此可以在任何值得使用的JS解释器中使用。它具有像英语一样阅读的额外好处。

对于现代浏览器(即IE 6-8以外的几乎所有浏览器),甚至都可以通过以下方式阻止该属性显示

for...in

Object.defineProperty(Object.prototype, 'can', {    enumerable: false,    value: function(method) {        return (typeof this[method] === 'function');    }}

问题在于IE7对象根本没有

.defineProperty
,而在IE8中,据称它仅适用于宿主对象(即DOM元素等)。如果兼容性是一个问题,则不能使用
.defineProperty
。(我什至不提IE6,因为在中国以外它不再重要了。)

另一个问题是,某些编码风格喜欢假定每个人都编写错误的代码,并禁止修改

Object.prototype
以防有人想要盲目使用
for...in
。如果您对此有所关注,或者正在使用这样做的代码(IMO
损坏 ),请尝试稍有不同的版本:

function can(obj, methodName){     return ((typeof obj[methodName]) == "function");}if (can(someObject, "quack")){    someObject.quack();}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5440092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存