javascript 面向对象实战思想分享


Posted in Javascript onSeptember 07, 2017

一直以来,很多新手都会经常问,我学完了基础知识,如何做项目?平时在公司工作都是做些什么?其实我想说,只要你找对方法,随便打开一个网站,都能是你的项目。

这里指的面向对象不单单适用于javascript,也适用其他语言。
万物皆对象,所以,任何事物都是有特征(属性)和动作(方法)的,一般拿到一份需求分档,或者你浏览一个网页看到一个画面的时候,脑子里就要有提炼出来的属性和方法的能力,那你才是合格的。

例如一个购物车例子

javascript 面向对象实战思想分享

估计很多人都做过购物车,我就不卖关子,做任何东西,先宏观思考*,然后再去处理细节,然后组装起来,就好像组装汽车的道理一样。例如上图,红色的就是属性,黄色的就是方法,抽象出属性和方法,其他都是死的。

假如是刚学前端的同学,可能就会用这种全局化的变量,也叫面向函数编程,缺点就是很乱,代码冗余

//商品属性
  var name = 'macbook pro'
  var description = ''。'
  var price = 0;
  //商品方法
  addOne:funcion(){alert('增加一件商品')},
  reduceOne:function(){alert('减少一件商品')},

  //购物车属性
  var card = ['macbook pro' ,'dell']
  var sum = 2,
  var allPrice = 22000,
  //购物车方法
  function addToCart:function(){
      alert('添加到购物车')
    }


  addToCart()

假如是单例模式的思想,可能会这样做,但这样还是不太好。对象太多,可能造成变量重复,项目小还可以接受

var product={
    name:'macbook pro',
    description:'',
    price:6660,
    addOne:funcion(){},
    reduceOne:function(){},
    addToCart:function(){
      alert('添加到购物车')
    }
  }

  /*购物车*/
  var cart={
    name:'购物车',
    products:[],
    allPrice:5000,
    sum:0
  }

假如是有一定经验的人,可能会这样子做。

function Product(name,price,des) {
    /*属性 行为 可以为空或者给默认值*/
    this.name = name;
    this.price = price;
    this.description = des;
  }
  Product.prototype={
    addToCart:function(){
      alert('添加到购物车')
    }
    addOne:funcion(){},
    reduceOne:function(){},
     /*绑定元素*/
    bindDom:function(){
    //在这里进行字符串拼接,
    //例如
    var str = ''
    str +='<div>价格是:'+this.privce+'</div>'
    return str
    },

  }

function Card(products,allPrice,sum) {
    /*属性 行为 可以为空或者给默认值*/
    this.products = products;
    this.allPrice = allPrice;
    this.sum = sum
  }
  Product.prototype={
    getAllPrice:function(){
      alert('计算购物车内商品总价')
    }
  }

通过创建各种对象例如macbook

//后台给的数据
 var products= [
    {name:'macbook',price:21888},
    {name:'dell',price:63999}
  ]

 var str = ''
 for(var i = 0,len=products.length;i<len;i++) {
    var curName = products[i].name
    var curName = new Product()
    curName.name=products[i].name;
    curName.price=products[i].price;
    str+= curName.bindDom()
  }

上面这种方式,就降低了耦合性,不管你用什么语言,还是任何javascript框架(模板引擎,jquery,react等),都是脱离不开上面那段代码的思想,

再来说说,现在mvvm的模式,例如vue,他们不需要获取dom,那么渲染的时候,定义好一个一个的组件就行了。属性全部用{{}}定义好,剩下的就是替换模板,就解决了。

data:{
    name ='',
    price='',
    description = ''
},
methods:{
   addToCart:function(){
      alert('添加到购物车')
    }
  addOne:funcion(){},
  reduceOne:function(){}, 
}

然后page级组件引入这个产品组件,然后循环这个产品组件就好了。

组件化的好处

将代码分类管理
代码清晰
容易维护
容易发现问题
代码可读性好
易于团队化协作
当然这篇文章是为了锻炼抽象化思维的能力,虽然跟javascript模块化的历程也有点搭边,我还希望大家在浏览任何网页的时候,去分析一下,这个模块你来设计,你会怎么设计,能做到解耦和,版本可迭代可维护,利于团队开发吗?

如有不对,请指正

Javascript 相关文章推荐
javascript 循环读取JSON数据的代码
Jul 17 Javascript
在网页中使用document.write时遭遇的奇怪问题
Aug 24 Javascript
用jquery实现自定义风格的滑动条实现代码
Apr 26 Javascript
mailto的使用技巧分享
Dec 21 Javascript
Angularjs 基础入门
Dec 26 Javascript
javascript实现控制文字大中小显示
Apr 28 Javascript
JS中字符串trim()使用示例
May 26 Javascript
jQuery实现下拉框选择图片功能实例
Aug 08 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
vue环境搭建简单教程
Nov 07 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
Aug 28 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
Sep 07 #Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 #Javascript
vue使用drag与drop实现拖拽的示例代码
Sep 07 #Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
Sep 07 #Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 #Javascript
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 #Javascript
bootstrap-table组合表头的实现方法
Sep 07 #Javascript
You might like
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
用js重建星际争霸
2006/12/22 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
Javascript 篱式条件判断
2008/08/22 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
vue页面更新patch的实现示例
2020/03/25 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
利用Python如何生成便签图片详解
2018/07/09 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Python函数和模块的使用总结
2019/05/20 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
建设单位项目负责人任命书
2014/06/06 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA