Javascript oop设计模式 面向对象编程简单实例介绍


Posted in Javascript onDecember 13, 2016

Javascript oop设计模式 面向对象编程

最初我们写js代码的时候是这么写

function checkName(){
    //验证姓名
  }

  function checkEmail(){
    //验证邮箱
  }

  function checkPassword(){
    //验证密码
  }

这种方式会造成全局变量的严重污染,再过渡到

var checkObject = {

  checkName : function(){};
  checkEmail: function(){};
  checkPassword: funcion(){}; 

}

//也可如此写
var checkObject = {} // || function(){}
checkObject.checkName = function(){};
checkObject.checkEmail = function(){};
checkObject.checkPassword = function(){};


//以上这两种写法不能复制一份,也就是说在new 方法创建新的对象的时候,新对象不能继承这些方法

以上是直接使用,而不是新建对象复制一份的,复制一份的话可以这么写

var checkObject = function(){

    return {
      checkName:function(){},
      checkEmail:function(){},
      checkPassword:function(){}
    }
  }
//使用的时候 可以

var a = checkObject();
a.checkName();

这么写可以实现对象的复制 但是这不符合面向对象,新创建的类和checkObject 没有任何关系
于是我们可以采用构造函数的方式书写代码

var checkObject = function(){
    this.checkName = function(){}
    this.checkEmail = function(){}
    this.checkPassword = function(){}
  }
//像这样我们便可以用CheckObject 来创建新的对象了,通过new 来创建对象,创建出来的每个对象都会对this上的属性进行复制,但是这么做的话,每次都会有相对较大消耗,对于共有的方法,我们可以放在对象的原型上

var checkObject = function(){};
checkObject.prototype.checkName = function(){};
//...


//这样写要将prototype 书写很多遍 ,所以我们可以这么写,并实现链式调用,将this返回

var checkObject = function(){};
checkObject.prototype={
  checkName:function(){
    //验证姓名
    return this;
  },

  checkEmail:function(){
    //验证邮箱
    return this
  },

  checkPassword:function(){
    //验证密码
    return this;
  }  

}

// 这两种方式不可混用,否则后边会覆盖前边,此时我们调用只需

new checkObject().checkName().checkEmail().checkPassword();

下面再来介绍一下面向对象和面向过程两种编程方式 .page 10

多个function 书写的方式是一种面向过程书写代码的实现方式,添加了很多全局变量而且不利于别人复用,在别人使用时你也不可修改,我们可以改用面向对象方式来重写,我们把需求抽成一个对象,这个对象称之为类,面向对象一个重要特点就是封装,将属性和方法封装在一个对象中,就像将物品放在一个旅行箱中,这样不管是使用和管理我们都方便,(虽然有时候感觉直接拿在外边摆放也很方便,但是东西一多便不利于管理)

var Book = (function () {
    //静态私有变量
    var bookNum = 0;
    //静态私有方法
    function checkBook() {
    }

    //返回构造函数
    return function (newId, newName, newPrice) {
      //私有变量
      var name, price;
      //私有方法
      function checkId(id) {
      }
      //特权方法
      this.getPrice = function () {
      };
      this.getName = function () {
      };
      this.setName = function (name) {
        this.name = name
      };
      this.setPrice = function () {
      };
      //公有属性
      this.id = newId;
      //公有方法
      this.copy = function () {
      };
      bookNum++;
      if (bookNum > 100)
        throw new Error('oop javascript');

      //构造器 实例化过程中被调用的方法
      this.setName(name);
      this.setPrice(price);

    }
  })();

  Book.prototype = {
    //静态公有属性
    isJSBook: false,
    //静态公有方法
    display: function () {
    }

  };
  //对比Java 别被js 起的这些名字弄混了 其实Js 就模仿了一个New 其他的跟Java基本一样 类 全局变量 方法 有自己的理解比较好 以前未想明白
  // java 为什么那么些

//为了看起来更像一个类 我们将原型上的方法 写到类里边

var Book = (function () {
    //静态私有变量
    var bookNum = 0;
    //静态私有方法
    function checkBook() {
    }

    //返回构造函数
     function _Book(newId, newName, newPrice) {
      //私有变量
      var name, price;
      //私有方法
      function checkId(id) {
      }
      //特权方法
      this.getPrice = function () {
      };
      this.getName = function () {
      };
      this.setName = function (name) {
        this.name = name
      };
      this.setPrice = function () {
      };
      //公有属性
      this.id = newId;
      //公有方法
      this.copy = function () {
      };
      bookNum++;
      if (bookNum > 100)
        throw new Error('oop javascript');

      //构造器 实例化过程中被调用的方法
      this.setName(name);
      this.setPrice(price);

    }
    _Book.prototype = {
      //静态公有属性
      isJSBook: false,
      //静态公有方法
      display: function () {
      }

    };
    return _Book;
  })();

下面再介绍一种创建对象的安全模式   

//注意 执行new Book 方法之前 this.title 会先执行一次
  var Book = function (title) {
    if (this instanceof Book) {
      alert(1);
      this.title = title;
    }else{
      return new Book(title);
    }
  };

  var book = new Book('js');
  alert(book.title);

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery连缀语法如何实现
Nov 29 Javascript
jquery等待效果示例
May 01 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
jQuery监控文本框事件并作相应处理的方法
Apr 16 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
Oct 01 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
Jun 10 jQuery
layui点击数据表格添加或删除一行的例子
Sep 12 Javascript
node+multer实现图片上传的示例代码
Feb 18 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 #Javascript
AngularJS自定义控件实例详解
Dec 13 #Javascript
Node.js中process模块常用的属性和方法
Dec 13 #Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
Dec 13 #Javascript
node.js 和HTML5开发本地桌面应用程序
Dec 13 #Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 #Javascript
vue.js学习之递归组件
Dec 13 #Javascript
You might like
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
python 控制语句
2011/11/03 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python简单实现控制电脑的方法
2018/01/22 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
pyspark 随机森林的实现
2020/04/24 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
Java程序员常见面试题
2015/07/16 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
详解Redis复制原理
2021/06/04 Redis