多态的实际含义是,同一操做,做用在不一样的对象上面,能够产生不一样的解释和不一样的执行结果。
javascript的变量类型在运行期是可变的,这就意味着javascript对象的多态性是与生俱来的。javascript
Java语言是一门静态类型的语言,因为在代码编译时要进行严格的类型检查,因此不能给变量赋予不一样类型的值,这种类型检查就会使代码变得僵硬,可是java也能够经过继承获得多态的效果(实现继承和接口继承) 能够向上转型来实现多态。java
下面一张图来解释:函数
主人同时向鸡和鸭两个对象发出指令 "发出叫声", 鸡和鸭同时发出叫声,可是他们的叫声是不同的。编码
咱们用代码来演示这个例子:spa
传统的代码咱们习惯用 if else 来堆砌硬编码代码,可是若是这个对象一直往上加就会形成不断的加代码,修改代码老是很危险的,修改的地方越多,程序出错的可能性就会越大,并且当动物的类型越多的时候就会形成if else 堆砌成了一个巨大的函数,不利于维护。prototype
var makeSound = function(animal) { if (animal instanceof Dog) { console.log('wanwan'); } else if(animal instanceof Cat) { console.log('miaomiao'); } } var Dog = function() {} var Cat = function() {} makeSound(new Dog()); makeSound(new Cat());
修改以后的代码以下:code
var makeSound = function(animal) { animal.sound(); } var Dog = function() {} Dog.prototype.sound = function(){ console.log('wanwan'); } var Cat = function() {} Cat.prototype.sound = function() { console.log('miaomiao'); } makeSound(new Dog()); makeSound(new Cat());
如何理解若是对象没法响应某个请求,它会把这个请求委托给它的构造器的原型,这条原则是原型继承的精髓所在,下面有这样的一段代码:对象
var obj = {name:'lin'};继承
var A = function() {};接口
A.prototype = obj;
var a = new A();
console.log(a.name);
解释:遍历对象a全部的属性,没有找到name这个属性查找name属性的这个请求被委托给对象a的构造器的原型,它被a._proto_记录而且指向A.prototype,而A.prototype被设置为对象obj在对象obj中找到name属性,而且返回