当前位置:嗨网首页>书籍在线阅读

12-多态

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.2.7 多态

多态这个吓人的词汇,是面向对象的一个术语,意思是一个实例不仅是它自身类的实例,也可以被当做它的任何父类的实例来使用。在很多面向对象语言中,多态是OOP中的一个很特殊的特性。而在JavaScript中,因为没有类型的概念,所以任何对象可以在任何地方被使用(虽然不能保证正确的结果),从这个角度来说,JavaScript具备终极的多态性。

在JavaScript中,所编写的代码经常采用某种形式的鸭子类型。这个方法来自于一句话“如果它走起来像鸭子,并且叫起来像只鸭子…那么它很可能就是一只鸭子”。我们继续沿用Car,如果一个对象含有 deployAirbags 方法,可能会被合理地认为是一个Car的实例。或对或错,但它至少是个很明显的提示。

JavaScript提供了 instanceof 运算符,它会指出某个对象是否属于某个给定类。也许不够智能,但是只要没有设置 prototype__proto__ 属性,它就是可靠的。

class Motorcycle extends Vehicle {}
const c = new Car();
const m = new Motorcyle();
c instanceof Car;                        // true
c instanceof Vehicle;                    // true
m instanceof Car;                        // false
m instanceof Motorcycle;                 // true 
m instanceof Vehicle;                    // true
JavaScript中所有对象都是基类 `Object` 的实例。也就是说,对于任何对象 `o` , `o instanceof Object` 的结果为 `true` (除非明确地设置了 `__proto__` 属性,而开发人员不应该这么做)。这个其实没有什么实际的效果,它的主要是为了提供一些对象都必须具备的重要方法,比如本章后面会讲到的toString。