JS面向对象基础篇(封装 继承 多态)

首先我们要创建一个对象,我们可以利用javascript的语法特征,以类的思想来创建对象

一:封装

(1)原始方法,代码如下

<script>
   var obj=new Object();
   obj.name=‘Tom‘; //给对象添加属性
   obj.sex=22;
   obj.showName=function(){
    //给对象添加方法
    alert(this.name);
}
   obj.showAge=function(){
    alert(this.age);
}
   obj.showName();   //‘Tom‘
   obj.showAge();   //22

//上面的方式通过new关键字生成一个对象,然后根据javascript是动态语言的特性来添加属性和方法,构造一个对象。其中this表示调用该方法的对象。
这种方式的问题是如果需要多次创建对象,那么需要重复代码多次,不利于代码的复用。

</script>

(2)工厂加工, 代码如下

<script>
   function createObj(name,age){
      var Obj=new Object();
      obj.name=name;
      obj.age=age;
      obj.showName=function(){
         alert(this.name);
}
      obj.showAge=function(){
         alert(this.age);
}
      return obj;
}

   var obj1=createObj(‘sun‘,22);
   var obj2=createObj(‘leo‘,21);

   obj1.showName();  //sun
   obj1.showAge();    //22
   obj2.showName();  //leo
   obj2.showAge();    //21

   //上面通过定义几个函数的对象,解决了不同对象持有函数对象的私有属性问题。现在所有对象的方法都持有上面两个函数的引用,但这么一来,对象的函数又和
   对象相互独立了,这和面向对象中持有方法属于与特定类的思想不符。
</script>

(3)构造函数方式, 代码如下

 <script>
      function person(name,age){
      //var this=new Object();  //系统模拟创建对象
      this.name=name;
      this.age=age;
      this.showName=function(){
         alert(this.name);
}
      this.showAge=function(){
         alert(this.age);
}
    //return this    //系统模拟返回了对象
}

   var obj1=new person(‘sun‘,22);
   var obj2=new person(‘leo‘,21);

   obj1.showName();  //sun
   obj1.showAge();    //22
   obj2.showName();  //leo
   obj2.showAge();    //21

   //构造函数的方式与工厂加工方式一样,会为每个对象创建独享的函数对象,当然也可以将这些函数对象定义在构造函数外面,这样又有了对象和方法
     相互独立的问题

   </script>

(4)原型方法, 代码如下

 <script>
       function person(){}  //定义一个空构造函数,且不能传递参数
       person.prototype.age=22;
       person.prototype.array=[‘sun‘,‘leo‘];
       person.prototype.showAge=function(){
           alert(this.age);
}
       person.prototype.showArray=function(){
           alert(this.array);
}

       var obj1=new person();  //生成一个person对象
       var obj2=new person();
       obj1.array.push(‘blue‘);  //向obj1的array属性添加一个属性
       obj1.showArray(); //‘sun‘,‘leo‘,‘blue‘
       obj2.showArray(); //‘sun‘,‘leo‘,‘blue‘

    //上面的代码通过obj1向obj1的属性array添加元素时,obj2的array属性的元素也跟着受影响,原因是在于obj1和obj2对象的array属性引用的是同一个Array
     对象,那么改变这个Array对象,另一个引用Array对象的属性自然也会受到影响

  </script>

(5)混合的构造函数/原型方式, 代码如下

  <script>
       function person(name,age){
        this.name=name;
        this.age=age;
}
       person.prototype.showName=function(){
        alert(this.name);
}
       person.prototype.showAge=function(){
        alert(this.age);
}

       var obj1= new person(‘sun‘,22);
       var obj2= new person(‘leo‘,21);

       obj1.showName();  //sun
       obj1.showAge();    //22
       obj2.showName();  //leo
       obj2.showAge();    //21

    //属性私有后,改变各自的属性不会影响别的对象。同时,方法也是由各个对象共享的。在语义上,这符合了面向对象编程的要求。

    </script>

二:继承(主要包括属性的继承和方法的继承)

代码如下
   <script>
      function person(name, sex){
        this.name=name;
        this.sex=sex;
}

     person.prototype.showName=function(){
           alert(this.name);
}
     person.prototype.showSex=function(){
          alert(this.sex);
}
   ////////////////////////////////////////////////////

     function worker(name,sex,job){
        person.call(this,name,sex);//构造函数伪装   调用父级的构造函数--为了继承属性
        this.job=job;
}

     //原型链  通过原型来继承父级的方法

     for(attr in person.prototype){
       worker.prototype[attr]=person.prototype[attr];
}
     worker.prototype.showJob=function(){
         alert(this.job);
 }

      var op=new person(‘blue‘,‘男‘);
      var ow=new worker(‘blue‘,‘男‘,‘程序员‘);

      op.showName();  //blue
      op.showSex();  //男
      ow.showName();  //blue
      ow.showsex();  //男
      ow.showjob();  //程序员

    //继承的好处:父类新加的功能,子类也具备该功能,子类新加的功能不会影响父类的功能
   </script>

原文地址:http://www.jianshu.com/p/a66f1ce2145a

时间: 2024-10-26 12:57:52

JS面向对象基础篇(封装 继承 多态)的相关文章

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

Java面向对象三大特性 封装 继承 多态

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get

面向对象三大特性:封装,继承,多态(二、多态)

多态 一,多态的概念 多态(polymorphism), 是指一个名字可以有多种语义.在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类.多态性使得向系统里增加新功能变得容易.继承性和多态性是降低软件复杂性有有效技术. 二,多态的实现 1.方法的重载 方法重载时: 参数必须不同.参数个数不同或类型不同. 返回值可以相同,也可以不同. 重载的价值在于它允许通过使用一个

面向对象三大特性:封装,继承,多态(一,封装和继承)

封装.继承和多态是面向对象程序设计的三个核心特性. 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想. 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂.更深入的程序开发. 多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易. 一.封装 封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,

Java面向对象一(封装 继承 多态 类 对象 方法)

1.封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 如下,人这个类封装了很多人的属性和行为: 2.继承:很好的实现了代码的复用,提高了编程效率. 人{ 年龄(属性一) 身高(属性二) 性别(属性三) 做事(行为之一) 走路(行为之二) 说话(行为之三)} 教师{ 年龄(属性一) 身高(属性二) 性别(属性三) 做事(行为之一) 走路(行为之二) 说话(行为之三) 教书(行为之四)} 教师继承了人的属性和行为,额外多出的是教书的行为.所以可以写成 教师 继承了 人这个类 的

面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)

多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型.,根据其实际的类型调用其相应的方法. 多态也叫动态绑定,也叫迟绑定. 多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme