zoukankan      html  css  js  c++  java
  • JS面向对象编程

    什么是面向对象编程(OOP)?用对象的思想去写代码,就是面向对象编程。

    面向对象编程的特点

    • 抽象:抓住核心问题
    • 封装:只能通过对象来访问方法
    • 继承:从已有对象上继承出新的对象
    • 多态:多对象的不同形态

    对象的组成

    • 属性:对象下面的变量叫做对象的属性
    • 方法:对象下面的函数叫做对象的方法

    一、使用Object函数或对象字面量都编程

    var obj1=new Object();//创建一个空的对象
            obj1.name='小明';  //属性
            obj1.showName=function(){   //方法
            alert(this.name);//this指向obj
     }
     obj1.showName();//小明
    
    var obj2=new Object();//创建一个空的对象
            obj2.name='小灰';  //属性
            obj2.showName=function(){   //方法
            alert(this.name);//this指向obj
     }
     obj2.showName();//小灰

    缺点:创建多个对象时,会产生大量的重复代码。

    解决方法:工厂方式——面向对象中的封装函数

    二、工厂方式——面向对象中的封装函数

    //工厂方式 : 封装函数
    function createPerson(name){
        var obj = new Object();
        obj.name = name;
        obj.showName = function(){
            alert( this.name );
        };
    
        return obj;    
    }
    var p1 = createPerson('小明');
    p1.showName();
    var p2 = createPerson('小强');
    p2.showName();

    缺点:创建对象都是使用Object的原生构造函数来实现的,因此无法识别对象类型

    解决方法:构造函数模式——给一个对象添加方法

    三 、构造函数模式——给一个对象添加方法

    //new 后面调用的函数叫构造函数
      function CreatePerson(name){
        this.name=name;
        this.showName=function(){
          alert(this.name);
        }
      }
      var p1=new CreatePerson('小明');//当new去调用一个函数时,函数中的this就是创建出来的对象而函数中的返回值就是this
       p1.showName();
      var p2=new CreatePerson('小强');
      p2.showName();
      //缺点
      console.log( p1.showName == p2.showName )//false 他们值不同,地址不同

    使用自定义的构造函数,定义对象类型的属性和方法,与工厂方式的区别:

    • 没有显式的创建对象
    • 直接将属性和方法赋给this对象
    • 没有return语句

    缺点:就是在创建对象时,每个对象都有一套自己的方法,每定义一个函数都实例化了一个对象

    解决方法:原型模式(prototype)——给一类对象添加方法

    四、原型模式(prototype)——给一类对象添加方法

    原型(prototype):重写对象下面公用的属性或方法,让公用的属性或方法在内存中只存在一份(提高性能),也就是说所有在原型对象中创建的属性或方法都直接被所有对象实例共享。

    • 原型:类比css中的class
    • 普通方法:类比css中的style
    function CreatePerson(name){//普通方法
      this.name=name;
    }
    CreatePerson.prototype.showName=function(){//原型
      alert(this.name);
    }
    var p1=new CreatePerson('小明');
    p1.showName();
    var p2=new CreatePerson('小强');
    p2.showName();
    console.log( p1.showName== p2.showName);//true   

    面向对象中this的问题

    一般会出现问题的情况有两种:

    • 定时器
    • 事件
    //定时器
    function Aaa(){
              var _this=this;//将当前this值保存
                this.a=12;
              setInterval(function(){//定时器中this指向window
                    _this.show();
               },1000);
    }
    Aaa.prototype.show=function(){
               alert(this.a);
     }
    var obj=new Aaa();//12
  • 相关阅读:
    如何用PostMan
    LINQ笔记-LINQ操作DataTable
    EF Core利用Transaction对数据进行回滚保护
    php 替换模板中的 PHP源码标签字符方法
    php读取文件使用redis的pipeline(管道)导入大批量数据
    Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程
    php 版本升高后 会出现 之Deprecated: Function ereg_replace() is deprecated的解决方法
    IIS + FastCGI+php(从5.2升级到5.3)
    Nginx 出现 _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/
    nginx 环境不支持thinkPHP
  • 原文地址:https://www.cnblogs.com/ycg-myblog/p/9876678.html
Copyright © 2011-2022 走看看