因为javascript没有专门的机制去实现类,所以这里只能是借助它的函数能够嵌套的机制来模拟实现类。在javascript中,一个函数,可以包含变量,也可以包含其它的函数,那么,这样子的话,我们就可以把变量做为类的属性,内部的函数则作为成员方法了。那么,外层的函数,就可以看成是一个类了。

1、首先我们写一个动物类吧,其实他是一个函数,只不过我们可以把它看成这个类的构造函数

 function Animal(){      console.log('Call the constuctor.');  }

2、然后我们可以使用new关键字来创建一个myClass类的实例

var cat = new Animal();

  这样,我们就创建了一个实例obj了,运行一下,使用相关的调试工具就可以看到Call the constructor的调试信息了。也就证明,我们创建类成功了。

3、那么,接下来,我们也可以给构造函数加上参数,比如:

function Animal(name){     this.name = name; }

  这样子,我们就可以创建实例,并且访问类的属性了

function myClass(name){     this.name = name; }
var cat = new myClass("Kate");
alert(cat.name);

  这样子,就可以访问到实例cat的属性name了。

4、大家都知道,动物会跳会吃,那么我们怎么给他加上方法呢?看下面

  方法一:直接在构造函数里面声明方法

function Animal(name){     this.name = name;
    this.jump = function(){         alert (this.name + " is jumping...");     };
this.eat = function(){ alert (this.name + " is eatting..."); }; }
var cat = new Animal("Kate");
alert(cat.name); cat.jump(); cat.eat();

  方法二:利用prototype为类添加方法

function Animal(name){     this.name = name; }
Animal.prototype = { type : 'cat',
jump : function(){ alert (this.name + " is jumping..."); },
eat : function(){ alert (this.name + " is eatting..."); }
}
var cat = new Animal("Kate");
alert(cat.name); alert(cat.type); cat.jump(); cat.eat();

  同样的,我们也可以用同样的方法为类添加新的属性,如type....

5、上面我们讲到的,是javascipt中,怎么创建一个类,以及怎么为类添加属性以及方法,接下来,我们谈一下怎么实现类的继承。

  要实现继承,我们可以通过prototype实现类的继承,首先,我们要先声明一个Dog类(如果还不懂,请重新看上面相关内容),并且让它继承Animal类。

function Dog(){}; Dog.prototype = new Animal("Henry");

  然后我们可以实例化一只新的狗dog出来,试着调用它的方法,看看成功了吗?

function Dog(){}; Dog.prototype = new Animal("Henry");
var dog = new Dog(); dog.jump(); dog.eat();

  显然,如果代码没敲错的话,应该可以看到提示“Henry is jumping...”,“Henry is eatting...”。

6、既然实现了类的继承,那就必然想到另外一个问题,那就是多态的问题。

   多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。

   通过继承,子类已经继承了父类的方法了,但要实现多态,势必对子类的方法进行重写。

  为了表达更明确,我们再创建一个Pig类出来,并且继承Animal类。怎么创建我就不说了。创建完的代码应该是像现在这样子。

function Dog(){}; Dog.prototype = new Animal("Henry");
function Pig(){}; Pig.prototype = new Animal("Coco");
var dog = new Dog(); dog.jump(); dog.eat();
var pig = new Pig();
pig.jump(); pig.eat();

  运行之后,因为继承了Animal类的原因,结果肯定又是“XX is jumping...”,“XX is eatting...”了,那我们要实现的,就是进行方法的重写。我们可以有下面的方式实现方法的重写。

function Dog(){};//创建dog子类 Dog.prototype = new Animal("Henry"); //重写dog的方法 Dog.prototype.jump = function(){     alert("Hi, this is " + this.name + ", I'm jumping...") }; Dog.prototype.eat = function(){     alert("Henry is eatting a bone now.");     };
function Pig(){};//创建pig子类 Pig.prototype = new Animal("Coco"); //重写pig的方法 Pig.prototype.jump = function(){ alert("I'm sorry. " + this.name + " can not jump."); }; Pig.prototype.eat = function(){ alert("Hi, I'm " + this.name + ", I'm eatting something delicious."); }
var dog = new Dog(); dog.jump(); dog.eat();
var pig = new Pig();
pig.jump(); pig.eat();

  运行一下,是不是实现了对方法的重写呢??

6、那么,假如我实例化一只dog之后,我想单独为这只dog添加属性和方法,怎么做呢?看下面

var dog = new Dog(); //添加属性和方法 dog.type = "Doberman Pinscher"; dog.shout = function(){     alert("I'm a " + this.type + "."); } dog.jump(); dog.eat(); //调用新的方法 dog.shout();

javascript 原型继承的更多相关文章

  1. 再谈javascript原型继承

    Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍<Javascript模式>中关于原型实现继承的几种方法,下面来一一说明下 ...

  2. 彻底理解Javascript原型继承

    彻底理解Javascript原型继承 之前写过一篇Javascript继承主题的文章,这篇文章作为一篇读书笔记,分析的不够深入. 本文试图进一步思考,争取彻底理解Javascript继承原理 实例成员 ...

  3. [转]Javascript原型继承

    真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承.Javascript原型继承是一个被说烂掉了的话题 ...

  4. JavaScript原型继承工作原理

    原型继承的定义 当你阅读关于JS原型继承的解释时,你时常会看到以下这段文字: 当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止.——出自JavaScript秘 ...

  5. 【读书笔记】读《编写高质量代码—Web前端开发修炼之道》 - JavaScript原型继承与面向对象

    JavaScript是基于原型的语言,通过new实例化出来的对象,其属性和行为来自于两部分,一部分来自于构造函数,另一部分是来自于原型.构造函数中定义的属性和行为的优先级比原型中定义的属性和优先级高, ...

  6. JavaScript 原型继承开端

    1.原型继承本质       就javascript对象系统的实现来讲,对象并没有原型,而构造器有原型(构造器.prototype指向其原型).对象只有构造自某个原型的说法,并没有持有某个原型的说法. ...

  7. 浅析Javascript原型继承(转)

    引自: http://blog.csdn.net/kittyjie/article/details/4380918 原作者解释的浅显易懂,非常不错的JavaScript prototype总结 JS没 ...

  8. Javascript原型继承容易忽略的错误

    编写Javascript的开发者都知道,JS虽然没有类(ES6添加了class语法),但是可以模拟出OOP语言的类和面向对象的概念,比如我们都知道的一句话,Javascript中处处是对象,而面向对象 ...

  9. javascript原型继承圣杯模式

    javascript纯面向对象开发需要使用到的一个模式,来对对象之间原型继承做中间层代理避免重复继承与代码杂乱 <!DOCTYPE html> <html lang="en ...

  10. javascript原型继承

    在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript由 ...

随机推荐

  1. 【译】Asp.Net Identity与Owin,到底谁是谁?

    送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have ...

  2. js async await 终极异步解决方案

    既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...

  3. urbuntu12.04 ftp服务器搭建

    1.安装ftp服务器: sudo apt-get install vsftpd 2..配置ftp 修改ftp的配置文件,该文件在/etc目录下,在终端中键入如下命令以打开配置文件: sudo vi / ...

  4. 使用Eclipse运行第一个Go程序

    Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developers Photon Release (4. ...

  5. java 代理 agency

    java并没有对其提供直接的支持,这是继承和组合的中庸之道,因为我们将一个成员对象置于所要构造的类中(组合),但与此同时我们在新类中暴露了该成员的所有方法(就像继承),使用代理时可以拥有更多的控制力, ...

  6. sqlmap工作流程图

  7. 利用word的VBA,为代码统一表格宽度,底色及行号

    如果文档中的代码表格时,感觉还是很快速有用的. Sub HangHao() ' ' hanghao 宏 ' ' Dim parag As Paragraph Dim nLineNum: nLineNu ...

  8. ubuntu下设置jupyter notebook 2017年07月29日 19:28:34 小旋锋 阅读数:8329 标签: ubuntu 更多 个人分类: python 二三事 来源:http://blog.csdn.net/suzyu12345/article/details/51037905 Ipython Notebook现在已经改名为Ipython jupyter,是最知名最好用的

    ubuntu下设置jupyter notebook     来源:http://blog.csdn.net/suzyu12345/article/details/51037905 Ipython No ...

  9. django 项目运行时media静态文件不能加载问题处理

    一.检查网页中的加载路径 如果路径不正确,首选调整html路径(当然也可以调整文件路径或修改models中upload_to路径,但是不要轻易改): 二.重点: 如果加载路径和实践路径一致,请按以下步 ...

  10. 多线程学习笔记二之JUC组件

    目录 概述 JUC锁框架图 使用内置锁还是JUC显示锁? 概述   为了对共享资源提供更细粒度的同步控制,JDK5新增了java.util.concurrent(JUC)并发工具包,并发包新增了Loc ...