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 相关文章推荐
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
JavaScript 的继承
Oct 01 Javascript
js如何判断不同系统的浏览器类型
Oct 28 Javascript
js实现的折叠导航示例
Nov 29 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
JavaScript定义变量和变量优先级问题探讨
Oct 11 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 Javascript
vue中各种通信传值方式总结
Feb 14 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
原生js+canvas实现贪吃蛇效果
Aug 02 Javascript
javascript实现搜索筛选功能实例代码
Nov 12 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
php 获取可变函数参数的函数
2009/08/26 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
python实现基本进制转换的方法
2015/07/11 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
python实现图像拼接
2020/03/05 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
幼儿园大班新学期寄语
2014/01/18 职场文书
合同协议书格式
2014/04/18 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
大学学生个人总结
2015/02/15 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
golang内置函数len的小技巧
2021/07/25 Golang
关于python类SortedList详解
2021/09/04 Python