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

    前言

    面向对象编程:

      就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法)--这个对象就称之为类

    面向过程编程:

      特点:封装,就是将你需要的功能放在一个对象里面

    -----------创建一个类

    var Person = function(name, height, weight){
      this.name = name;
      this.height = height;
      this.weight = weight;
      this.say = function(){
        console.log("hello world");
      } }

    这样我们就创建了一个 Person 类,他有三个属性,但是我们同样也可以在类的原型添加属性和方法:

    Person.prototye.work = function(){
       console.log('Java')      
    }
    或者你也可以这样写:
    Person.prototype = {
      work: function(){
        console.log('Java')
      }
    }

    这是通常我们用来封装类的方式,把我们常用的属性和方法已经封装到我们抽象的Person这个类里面了~

    在使用这个Person这个类的时候我们不能直接使用person类,需要用 new 关键字去实例化(创建)一个新的对象,这样我们就可以通过对象点属相或者方法去访问

    var peopleOne = new Person('Mike','180cm','60kg')
    console.log(peopleOne.name) // Mike

    Js是一种基于原型prototype的语言,在原型上添加方法和属性,都可以通过创建的对象去访问.

    原因就在于每创建一个对象时,都有一个原型prototype用于指向其集成的属性和方法~

    所以,我们创建的对象去使用类自身没有封装的方法时,就会通过prototype一级一级查找,通过prototype继承的属性和方法都可以被访问而不会再创建~

      constructor大家都不陌生,是构造函数,Js中,当创建一个函数或者对象时都会为其创建一个原型对象prototype,而prototype对象又会像函数中的额this一样创建一个constructor属性,那么这个属性指向的就是拥有整个原型对象的函数或对象..(另外:Js中,万物兼对象,函数function也是对象)..新创建的对象访问类的原型指向的对象可以通过 __proto__ 但是实际开发中,这个并不会使用...

      prototype对象中的属性和方法被称为共有属性和共有方法.类也有私有属性和私有方法,通过该类实例的对象不能访问~

    var Person(name,age){
      //对象公有属性
      this.name = name;
      this.age = age
      //对象公有属性
      this.say = function () {
        alert('hello')
      }
    //特权方法
      this.getName = function(){
        return this.name
      }
      this.setName = function(newName){
        this.name = newName
      }
      
      //私有属性
      var num = 100
      //私有方法
      function ill(){}
      
      //构造器
      this.setName('mike')
      } }
    //类静态公有属性
    Person.isChinese = true;
    //类静态方法
    Person.run = function () {
      console.log('running')
    }

    Person.prototype = {
      //公有属性
      isYoung: true,
      //公有方法
      sing: function(){
        console.log('singing')
      }
    }

    当然我们也可以将类的静态变量通过闭包来实现,例如

    var Person = (function(){
      //静态私有变量
      var isCute = true
      //静态私有方法
      function run() {}

      //返回构造函数
      return function(name,age){
        //私有变量
        var num = 100
        //私有方法
        function ill(){}

        //特权方法
        this.getName=function(){}
        this.setName=function(newName){}
        //公有属性
        this.name=name;
        //公有方法
        this.draw=function(){}
        //构造器
        this.setName(newName)
      }
    })()

    Person.prototype={
      //静态公有属性
      isYoung:true,
      //静态公有方法
      run:function(){}
    }

     闭包时有限访问弄一个函数作用域中变量的函数,即在一个函数内部创建另一个函数

    我们将这个闭包作为创建对象的构造函数,这样它既是闭包,又是可实例对象的函数,即可访问到类函数作用域中的变量,例如 isCute 这个变量,此时就是静态私有变量, run 方法为静态私有方法...当然闭包内部有自己的私有变量 num ,私有方法 ill ...(以上面闭包为例)

    当然,也可以在闭包内部实现完整的类然后将其返回(return)出去,这里不做示例~

    既然有了类,但是有些人总会不可避免的忘记 new 关键字,这时候,我们需要可以手动为其加个判断,以防没有 new 而出错

    var Person = function(name){
      if(this instanceof Person){
        this.name = name
      }else{
        return new Person(name)
      }
    }

    此时,你就不必再为少了new关键字而出错~~

    本篇结束,后续更新...

  • 相关阅读:
    [翻译]关于堆和堆栈
    sql 字符+数值 混合排序 lcs
    证明DataReader分页的可行性 lcs
    谈谈我对小公司、大公司及个人成长的见解 lcs
    sina 通用js代码说明 lcs
    Linux系统下生成证书 https证书
    【转】51单片机外部中断的C51编程
    【转】如何建立个人网站
    【转】关于C51的中断编程[原创]
    【转】毫不费力:破解加密PDF文档就使用这两三招
  • 原文地址:https://www.cnblogs.com/gxlself/p/8642081.html
Copyright © 2011-2022 走看看