前言

面向对象编程:

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

面向过程编程:

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

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

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关键字而出错~~

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

JS面向对象与面向过程的更多相关文章

  1. JS高级---体会面向对象和面向过程的编程思想

    体会面向对象和面向过程的编程思想 ChangeStyle是自定义的构造函数,再通过原型添加方法的函数. 实例化对象,导入json参数,和创建cs,调用原型添加的方法函数 过渡,先熟悉记忆 <!D ...

  2. 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

    一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...

  3. 面向对象与面向过程 $this的注意事项和魔术方法set和get

    一.面向对象与面向过程的区别: 二者都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象.面向对象更加强调运用人类在日常的思维逻辑 ...

  4. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  5. Java基础知识强化20:面向对象和面向过程的思想对比

    面向对象与面向过程的区别  1. 与面向对象编程思想相比较的,往往是面向过程的编程思想,其实在我来理解,两者并不冲突,原因是面向对象的编程也必须使用面向过程的思维来实现具体的功能,所以我认为,两者的区 ...

  6. python的面向对象和面向过程

    一.面向对象和面向过程的区别: a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object ...

  7. 面向对象和面向过程,python中的类class,python中程序的入口——main方法,

    1.程序入口,让main显现出来: print(__name__)#__name___是模块中的隐藏字段,当前模块运行的函数名 if __name__ == __main__ __main__() # ...

  8. PHP面向对象和面向过程

    编程界不论是PHP.Python都有这么两种编程思想,oop面向对象.pop面向过程,这两种在功能上没有多大区别,但是在代码编写上却有很大区别.今天就记录一下面向对象和面向过程的优点.缺点.定义.实现 ...

  9. Day5-1 面向对象和面向过程

    摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...

随机推荐

  1. c# try-finally有什么用

     finally 代码块中的代码是 try-catch 结构执行完后无论有无异常发生都会执行的.finally 代码块中的代码是 try-catch 结构执行完后无论有无异常发生都会执行的.final ...

  2. linux iptables扩展,脚本防火墙

    netfileter:防火墙内核态ip tables:防火墙用户态(管理防火墙规则) iptables的表和链表包括不同的链,链包括大量的规则4个表: raw,mangle,nat,filter5种链 ...

  3. 一个可以自由定制外观、支持拖拽消除的MaterialDesign风格Android BadgeView

    为了尊重作者,先放上链接:https://github.com/qstumn/BadgeView BadgeView 一个可以自由定制外观.支持拖拽消除的MaterialDesign风格Android ...

  4. FusionCharts封装-dataset和categories

    Chart.java: /** * @Title:Chart.java * @Package:com.fusionchart.model * @Description:FusionCharts 封装d ...

  5. 使用jQuery的一些建议

    1.尽可能使用id选择器而不是类选择器 例如: //html <p id="chooseId">测试文本</p> //jQuery console.time ...

  6. httpclient的理解(代码理解)

    一,httpclient的理解  httpcliet就是模仿浏览器在服务器内部从一个项目调用另一个项目的技术.比如说调用接口等. HttpClient 是 Apache Jakarta Common ...

  7. Java并发系列[8]----CyclicBarrier源码分析

    现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始.例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始.在JUC包中为我们 ...

  8. 极速搞定1小时不出结果SQL的优化(SQL Tuning)

    今天帮用户做了一个SQL TUNING,原来为1个多小时不出结果,TUNING后为几秒,图片为我调优时参考的explain plan,隐去某些具体信息,虽然通过该计划,不能完全确定SQL慢的原因,但稍 ...

  9. 初入前端框架bootstrap--Web前端

    Bootstraps是一种简洁.直观.强悍的前端开发框架,它让web开发更迅速.简单.对于初入Bootstrap的小白,高效进入主题很重要,能为我们节省很多时间,下面我将对使用Bootstrap开发前 ...

  10. 【转载】Java并发编程:volatile关键字解析(写的非常好的一篇文章)

    原文出处: 海子 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volat ...