JS面向对象与面向过程

gxlself 2018-03-24 原文

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

本篇结束,后续更新…

发表于 2018-03-24 23:41 gxlself 阅读() 评论() 编辑 收藏

 

版权声明:本文为gxlself原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gxlself/p/8642081.html

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

  1. 有些ES6方法极简,但是性能不够好

    有些ES6方法极简,但是性能不够好 So,也许你觉得ES6让你视野大开,但是并不是性能也能跟得上~ 首先,让我 […]...

  2. 原型笔记

    原型笔记 1. Object.getOwnPropertyNames()   在学习使用该方法的时候,查阅了《 […]...

  3. ES6 ——— const

    ES6 ——— const 对于es6使用的也挺频繁,但是有些东西真的使用 […]...

  4. html+css+js 实现一个网页小demo

    js 从一个1.html跳转到另一个2.html页面并携带一定的数据 最近开始涉及js的学习,由于之前有一些h […]...

随机推荐

  1. 3B1B微分方程系列笔记(三)

    该系列为3Blue1Brown微分方程系列视频笔记,原视频可见:https://www.bilibili.co […]...

  2. [转] 室内定位(总结:种类,方法,特点) 室内定位(总结:种类,方法,特点)

    2018.10.23 Update: 最近好多同学问我怎么采集数据,怎么实现最基础的定位,我整理了一个基础的W […]...

  3. docker

    为什么要使用Docker? 作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。 更高 […]...

  4. U盘从4G变为了75M 恢复U盘容量的方法

      我的U盘是PNY的做了一次系统启动盘,突然容量又原来的4G变为了75M,郁闷,于是上网上搜了一下解决办法, […]...

  5. 新年新气象,接个私活赚点生活费?说说这里的弯弯绕

    现在到处讲副业,怎么样利用副业赚钱,这能理解,一方面年轻人生存压力大,多赚钱点总是没有坏处;另一方面,每年的裁 […]...

  6. VisualTreeHelper使用——使用BFS实现高效率的视觉对象搜索

    BFS,即广度优先搜索,是一种典型的图论算法。BFS算法与DFS(深度优先搜索)算法相对应,都是寻找图论中寻路 […]...

  7. SQL中join的用法解析(inner join、full out join、left join)

    版权声明:本文为CSDN博主「Megustas_JJC」的原创文章,遵循 CC 4.0 BY-SA 版权协议, […]...

  8. 360导航框架

    1.CSS代码 1 @charset "utf-8"; 2 /* CSS Document */ 3 #a 4 […]...

展开目录

目录导航