JS面向对象关于类的封装、继承、多态

一、封装:把实现一个功能的代码放在一个函数中封装起来,以后再想实现这个功能的时候,我们不需要重新的编写代码了,只需要执行对应的函数即可,我们把这种机制就称之为"函数的封装" -->低耦合高内聚:减少页面中的冗余代码,提高代码的重复使用率

二、多态

后台语言[java、C#、ASP.net、php...]中的多态:重载、重写
重载(Reload):多个方法,方法名相同,参数的个数或者参数的类型不一样
重写(Rewrite):子类重写父类的方法

JS严格意义上不存在重载,后面的方法会把前面的方法覆盖掉;

JS中的多态指的是一个方法的多种形态:一个方法,我们通过传递进来的参数值的不一样,实现不一样的功能

//根据传递的n和m的值不一样,我们获取的结果也不一样,例如:如果执行的时候不传递任何的参数,返回[0-1)之间的随机小数,如果传递了两个值1/10,返回的是[1-10]之间的随机整数

function getRandom(n,m){
n = NUmber(n);
m = Number(m);
if(isNaN(n) || isNaN(m)){
return Math.random();
}
if(n>m){
n= n+m;
m= n-m;
n =n-m
}
return Math.round(Math.random()*(m-n)+n);
}

三、继承

继承:子类继承父类中的属性和方法(私有的/公有的)

1.原型继承:子类.prototype = new 父类;既可以继承父类私有的,也可继承父类公有的,并且都继承到子类的公有上了 ->父(私有+公有) 变为 子(公有);

->核心原理:和生活中儿子继承爹的基因原理是不一样的;生活中是儿子把爹的基因克隆一份一模一样的到自己的身上,接下来儿子怎么改都跟父亲没关系;但是原型继承并不是把父类的属性和方法克隆一份到自己这,只是改变了原有的原型的指向,当我们在使用父类方法的时候,是通过原型链的查找机制一级级的向上查找使用的...

  function A() {
        this.x = 100;
    }
    A.prototype.getX = function () {
        console.log(this.x);
    };

    function B() {
        this.y = 200;
    }
    //想让B作为子类,继承A这个父类中的私有的/公有的属性和方法
    B.prototype = new A;

    var b = new B;
    b.getX();

->重写:子类重写父类的方法
b.aa=function(){} ->写在b这个小的实例私有属性上,和B的其他实例没有任何的关系
b.__proto__.bb=function(){} ->写在B.prototype上的
b.__proto__.__proto__.cc=function(){} ->写在A.prototype上的.


2.call继承:call继承只能把父类的私有的属性,继承到子类的私有属性上 ->父(私有) 变为 子(私有);

->原理:在子类B中,把父类A当做普通的函数的执行(A原型上写的方法等都起不到作用了),然后让A执行的时候,里面的this变为B的一个实例,也就是在A函数体中写的this.xxx=xxx其实也相当于给B的实例增加了一些私有的属性(属于直接把A中的拿过来一份)...

    function A() {
        this.x = 100;//->也就是此时A作为一个普通函数执行,私有作用域中的this->b ->b.x=100;
    }
    A.prototype.getX = function () {
        console.log(this.x);
    };

    function B() {
        //this->B的实例b
        this.y = 200;//->b.y=200;

        A.call(this);//->执行A这个方法,让里面的this关键字变为b
    }
    var b = new B;

3.混合继承:call继承/冒充对象继承+原型继承

 function A() {
        this.x = 100;
    }
    A.prototype.getX = function () {
        console.log(this.x);
    };

    function B() {
        this.y = 200;
        A.call(this);
    }
    B.prototype = new A;
    var b = new B;

    //b
    //私有的 y:200 x:100
    //b.__proto__-> x:100
    //b.__proto__.__proto__-> getX:function...

4.冒充对象继承

->原理:在子类B的函数体中,创建父类A的一个实例temp(此时的temp就拥有了A的私有和公有的属性),接下来把temp当做一个普通的对象进行遍历,把遍历到的私有和公有的属性分别的添加给B的实例b(这样也相当于把父类中的克隆一份一样的拿到子类上了)...
->父(公有+私有) 变为 子(私有)

 function A() {
        this.x = 100;
    }
    A.prototype.getX = function () {
        console.log(this.x);
    };

    function B() {
        //this->b
        this.y = 200;

        var temp = new A;//->创建A的一个实例temp,它是一个对象数据类型,temp就拥有了A这个类的私有和公有的属性和方法 x:100 getX:function...
        for (var key in temp) {//->for in即可以循环temp私有的,也可以循环公有的
            this[key] = temp[key];//->第一次 b.x=temp.x=100 ...
        }
        temp = null;
    }
    var b = new B;
更多相关文章
  •                         JavaSE 封装 继承 多态方法重载(Overload).表示两个或多个方法名字相同,但方法参数不同(1.参数个数不同,2.参数类型不同).注意:方法的返回值对重载没有任何影响.public clss Person{     int age ;    ...
  • 面向对象三大特性:封装,继承,多态(一,封装和继承)
    封装.继承和多态是面向对象程序设计的三个核心特性. 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想. 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂.更深入的程序开发. 多态允许以一种统 ...
  • JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.cla ...
  • 封装: 1.对于头文件里的一些成员变量,可以使用@private @public @protected来限制权限 @public 公有的 类本身可以访问,子类可以继承,外部也可以访问 @private 私有的 类本身可以访问,子类无法继承,外部不可以访问 @protected 受保护的 类本身可以访 ...
  • 面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)
    多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型.,根据其实际的类型调用其相应的方法. 多态也叫动态绑定,也叫迟绑定. 多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象
  • 相关链接: alert(p1.age); age = p1.setAge(20 alert(p1.getAge()); this.setAge和this.getAge两个方法使用到了局部变量age,所以age不会被回收. 如果只有set方法,说明该属性是只写属性. 如果只有get方法,说明该属性是只 ...
  • 简单的封装继承多态
    首先创建一个工程, 然后创建一个动物类(Animal),然后再创建一个猫类和一个狗类,最后创建一个人类来给动物喂食. 动物类继承NSObject 而猫类和狗类继承动物类 人类喂食也继承NSObject 动物类 ; } 最后得到下面的. 当然这基本是最简单了.
  • 面向对象三大特征:封装.继承.多态    封装指的是将对象的状态信息和行为捆绑为一个逻辑单元的机制,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问.简单来说就是属性私有化,对外提供统一访问的get/set方法.    下面通过程序来理解一下封装 ...
一周排行
  • 国企如何发展自己的信息化队伍(http://www.zdnet.com.cn/)     这篇文章是笔者在大型国企多年的信息化工作经验而总结出的一点体会,主要谈论了如何创建一个技术过硬.管理科学,锐意进取和朝气蓬勃的 ...
  • 用uniq命令可以删除相邻的重复行:uniq [file]但如果一文本中有重复却不相邻的行则无法删除,需要结合sort命令:sort [file]|uniq等效的sort命令是:sort -u [file]另外uni ...
  • SQLServer客户端连接的问题
    经常遇到 SQL Server 客户端无法连接到SQL Server 实例(服务).现在将 ...
  • A: Welcome aboard! B: Thank you, I'm delighted to be working here, Mr. Buchwald. ABA: Call me Buck, will you ...
  • 1.whois命令 --> jwhois2.rz sz命令 --> lrzsz3.iostat命令--> sysstat4.vmstat命令 --> procps
  • 一.数值类型Mysql支持所有标准SQL中的数值类型,其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC),以及近似数值数据类型(FLOAT,REAL,DOUBLE PRESIS ...
  • Exchange版本:2010Windows Server版本:2008R2报错信息如下:解决方法:1.重启IIS(在cmd中执行iisreset)2.方法1如无法解决,重启服务器即可.
  • 目前的工作就是在这个叫vtysh的工具上进行修改,终极目的是把它作为一个代替shell的东西.以此来屏蔽用户和系统之间的接触,减少用户对系统的操作权限.
  • 一致性算法Raft详解
    背景 熟悉或了解分布性系统的开发者都字段一致性算法的重要性,Paxos一致性算法从90年提 ...
  • 浅析Windows安全相关的一些概念
    Session我们平常所说的Session是指一次终端登录, 这里的终端登录是指要有自己的 ...