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

b96b28538af36077631db6b193838877.png

撒科打诨

没有“这个类必须具有这些功能”的概念(即,本身没有接口),因为:JavaScript继承基于对象,而不是类。直到你意识到这一点并不重要:JavaScript是一种极其动态类型的语言 - 您可以使用适当的方法创建一个对象,这将使其符合接口,然后取消定义使其符合的所有内容。破坏类型系统很容易 - 甚至意外! - 首先尝试制作类型系统是不值得的。相反,JavaScript使用所谓的duck typing。(如果它像鸭子一样走路,像鸭子那样呱呱叫,就JS而言,它就是鸭子。)如果你的对象有quack(),walk()和fly()方法,代码可以在任何预期的地方使用它一个可以行走,嘎嘎叫和飞行的物体,而不需要实现一些“Duckable”接口。接口正是代码使用的函数集(以及这些函数的返回值),并且使用duck typing,您可以免费获得。现在,这并不是说你的代码不会在中途失败,如果你试图打电话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();}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值