资讯专栏INFORMATION COLUMN

Javascript 语言的多态

enali / 3216人阅读

摘要:多态的实际含义是,同一操作,作用在不同的对象上面,可以产生不同的解释和不同的执行结果。的变量类型在运行期是可变的,这就意味着对象的多态性是与生俱来的。

多态的实际含义是,同一操作,作用在不同的对象上面,可以产生不同的解释和不同的执行结果。
javascript的变量类型在运行期是可变的,这就意味着javascript对象的多态性是与生俱来的。

Java语言是一门静态类型的语言,由于在代码编译时要进行严格的类型检查,所以不能给变量赋予不同类型的值,这种类型检查就会使代码变得僵硬,但是java也可以通过继承得到多态的效果(实现继承和接口继承) 可以向上转型来实现多态。

下面一张图来解释:

主人同时向鸡和鸭两个对象发出指令 "发出叫声", 鸡和鸭同时发出叫声,但是他们的叫声是不一样的。

我们用代码来演示这个例子:

传统的代码我们习惯用 if else 来堆砌硬编码代码,但是如果这个对象一直往上加就会造成不断的加代码,修改代码总是很危险的,修改的地方越多,程序出错的可能性就会越大,而且当动物的类型越多的时候就会造成if else 堆砌成了一个巨大的函数,不利于维护。

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());

修改之后的代码如下:

 
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属性,并且返回

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92694.html

相关文章

  • javascript设计模式与开发实践(一)- 多态

    摘要:当我们对一些函数发出调用的消息时,这些函数会返回不同的执行结果,这是多态性的一种体现,也是很多设计模式在中可以用高阶函数来代替实现的原因。 PS:上一篇文章发表之后,很多朋友关注了本人的思否和掘金的博客,虽然关注的朋友还有有限,但足够让我把自己在技术上的问题积累分享给大家,也希望大家能够喜欢,同时能动一动手指,给一颗心(赞),博主会持续更新下去 多态 本文是《javascript设计模...

    wthee 评论0 收藏0
  • JavaScript设计模式与开发实践 | 01 - 面向对象JavaScript

    摘要:在中,并没有对抽象类和接口的支持。例如,当对象需要对象的能力时,可以有选择地把对象的构造器的原型指向对象,从而达到继承的效果。本节内容为设计模式与开发实践第一章笔记。 动态类型语言 编程语言按数据类型大体可以分为两类:静态类型语言与动态类型语言。 静态类型语言在编译时已确定变量类型,动态类型语言的变量类型要到程序运行时,待变量被赋值后,才具有某种类型。 而JavaScript是一门典型...

    suxier 评论0 收藏0
  • javascript面向对象之“多态

    摘要:之前,本质上不能算是一门面向对象的编程语言,因为它对于封装继承多态这些面向对象语言的特点并没有在语言层面上提供原生的支持。所以在中出现了等关键字,解决了面向对象中出现了问题。 ES6之前,javascript本质上不能算是一门面向对象的编程语言,因为它对于封装、继承、多态这些面向对象语言的特点并没有在语言层面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以让我们以...

    JerryWangSAP 评论0 收藏0
  • 更好理解面向对象Javascript 1 —— 动态类型和多态

    摘要:动态类型语言和鸭子类型编程语言按照数据类型大体可分为静态类型语言和动态类型语言。鸭子类型的概念至关重要,比如一个对象有了属性,也可以依照下标来存取属性,这个对象就可以被当做数组来使用。 前言 曾经对Javascript的面向对象相关知识也有过了解,从各种博客、书籍上也学到了很多。但是最近在看《Javascript设计模式与开发实战》这本书时发现该书对这方面的知识点介绍的很易于理解,因此...

    shusen 评论0 收藏0
  • 学习设计模式前需要知道事情

    摘要:为什么要学习设计模式做事情之前问个为什么总是好的。设计模式的使用方法关于使用方式,像我这种初学者最容易犯的错误就是生搬硬套,但是模仿本来也是学习的一个过程,最重要的事情是在模仿中要学会思考。 为什么要学习设计模式? 做事情之前问个为什么总是好的。关于设计模式的好坏,我在知乎上也看过一些讨论,有知友对其提出过一些疑问,里面有一些关于设计模式的观点: 设计模式有何不妥,所谓的荼毒体现在哪...

    kviccn 评论0 收藏0

发表评论

0条评论

enali

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<