面向对象基础

——定义:在不了解原理的情况下,会使用功能

——对象:不了解内部的结构,知道表面的各种操作(按钮),如date,array

【面向对象是一种通用思想】

——面向对象编程(OOP)特点

抽象:把最主要的特征,跟问题相关的特征抽出来(抓住核心问题);

封装:不考虑内部的实现,只考虑功能的使用;

继承:从父类上继承出一些方法,属性;子类又有一些自己的特性(在最大限度上重用已有的代码)。

【多重继承】:有多个父级,但容易导致程序混乱;【多态】:对JS用途不大,适用于强语言。

——对象的组成

属性:原来叫做变量,属于对象

方法:原来叫做函数,属于对象

——this:当前的方法属于谁

全局的方法属于window,故this为window

——为对象添加方法和属性

不能在系统对象中(如数组)随意附加方法,属性,否则会覆盖已有方法、属性

——使用Object对象

可随意附加方法,属性。

构造函数与普通函数没有区别,只是功能不同故称为构造函数。

——工厂方式

什么是工厂方式:包括原料,加工,出厂;用构造函数创建一个类;

问题:1. 没有new;2.函数重复——资源浪费

解决问题1: 当调用函数时前面加上 new,系统会偷偷创建一个空白对象,并返回出去;

解决问题2:运用原型(prototype),给类添加方法

原型(prototype):相当于css中的class,一次给多个元素加东西

类(模子):本身不具备功能,用来生产产品;如var arr = new Array() 中的Array

对象(产品/成品):由类产生的,如上面的 arr

       function CreatePersoon(name,qq){     //构造函数//系统偷偷替咱们做://var this = new Object();//加工this.name = name;this.qq = qq;//也会偷偷做一些//return this;}CreatePersoon.prototype.showName = function (){     //原型console.log('我的名字叫:' + this.name);}CreatePersoon.prototype.showQQ = function(){console.log('我的QQ号:' + this.qq)}     var obj = new CreatePersoon('blue','5454548');var obj2 = new CreatePersoon('htrth','5887778');obj.showName();obj.showQQ();obj2.showName();obj2.showQQ();        console.log(obj.showName == obj2.showName);

——流行的面向对象编写模式

用混合方式构造对象;

原则:用构造函数加属性;用原型加方法;

对象命名规范:类名的首字母大写

面向对象实例

——将一个普通选项卡改为面向对象

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
<style type="text/css">#div1 input {background: white;}#div1 input.active {background: yellow;}#div1 div {width: 200px;height: 200px;background: #ccc;display: none;}
</style>
<script type="text/javascript">window.onload = function (){var oDiv = document.getElementById('div1');var aBtn = document.getElementsByTagName('input');var aDiv = oDiv.getElementsByTagName('div');for (var i = 0; i < aBtn.length; i++) {aBtn[i].index = i;aBtn[i].onclick = function (){for (var i = 0; i < aBtn.length; i++) {aBtn[i].className = '';aDiv[i].style.display = 'none'};this.className = 'active';aDiv[this.index].style.display = 'block';}};}
</script>
</head>
<body><div id="div1"><input class="active" type="button" value="aaa" /><input type="button" value="bbb" /><input type="button" value="ccc" /><div>aaa</div><div>dscsdvcs</div><div>vfdvda</div></div>
</body>
</html>
原则:不能有嵌套函数,但可以有全局变量(尽量不用)
过程
1. 让函数没有嵌套;
2. 将window.onolad 改为构造函数;
3. 将变量改为属性,函数改为方法
改错
1. 将函数变为方法时前面需加this;
2. 原型中的this指向发生了改变,变成input而不是TabSwitch;将this重新定义,通过闭包传递this
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title><style>#div1 input{background-color: #ffffff;}#div1 .active{background-color: yellow;}#div1 div{width: 200px;height: 200px;background-color: #ccc;display: none;}</style><script>window.onload = function(){new TabSwitch('div1')}function TabSwitch(id){       //将onload改为构造函数,用于初始化对象var _this = this;var oDiv = document.getElementById(id);this.aBtn = oDiv.getElementsByTagName('input');     //将变量改为属性this.aDiv = oDiv.getElementsByTagName('div');for (var i = 0; i < this.aBtn.length; i++) {this.aBtn[i].index = i;this.aBtn[i].onclick = function (){_this.fnClick(this);       //传参}     }}TabSwitch.prototype.fnClick = function(oBtn){       //将嵌套的函数提出//用原型将函数变为方法// console.log(this);for (var i = 0; i < this.aBtn.length; i++) {this.aBtn[i].className = '';this.aDiv[i].style.display = 'none';}oBtn.className = 'active';this.aDiv[oBtn.index].style.display = 'block'}</script>
</head>
<body><div id="div1"><input type="button" value="111" class="active"><input type="button" value="222"><input type="button" value="333"><div style="display: block;">164684</div><div>5464</div><div>dwqd</div>     </div>
</body>
</html>

面向对象高级

——JSON方式的面向对象

    var json={  name: 'frank',  qq: '123456',  showName:function()  {  alert('我的名字:'+this.name);  },  showQQ:function()  {  alert('我的qq:'+this.qq);  }  };  json.showName();  json.showQQ();  

优缺点:简单,但不适合多个对象,适合整个程序里只有一个(如AJAX),写起来简单

命名空间:可以让多个相同名字的函数同时存在,把同一类的方法包在一起

var zns={};  zns.one={};
zns.two={};
zns.three={};  zns.one.getUser=function()
{  alert('aaa');
};
zns.two.getUser=function()
{  alert('bbb');
};
zns.three.getUser=function()
{  alert('ccc');
};  zns.one.getUser()
zns.two.getUser()
zns.three.getUser() 

——对象的继承

对象由属性和方法组成,继承的也是属性和方法

继承属性:call(this,参数);可以改变函数执行时的this

继承方法:引用,直接运用var arr1 = arr2; 的形式会导致改变其中一个另外一个也会改变;故需要建立新的数组arr2,在arr1中做for循环,将arr1中的所有元素push到arr2中;

    function A()  {  this.abc=12;  }  A.prototype.show=function ()  {  alert(this.abc);  };  //继承属性  function B()  {  //this->new B()  A.call(this)  };  B.prototype.fn=function ()  {  alert('aaa');  };  //继承方法 要用循环,不然B会影响A  //B.prototype=A.prototype; //前面是把两个原型指向一个方法,修改任意一个另一个都会受到影响  for (var i in A.prototype)  {  B.prototype[i]=A.prototype[i];  }  var objB=new B();  var objA=new A();  //检验属性  alert(objB.abc);  //检验方法  objB.show();  objB.fn();  //正常不弹出,A中没有这个方法  objA.fn();  

——面向对象拖拽的继承

window.onload = function(){var oDiv = document.getElementById('div1')oDiv.οnmοusedοwn=function (ev)  {  var oEvent=ev||event;  var disX=oEvent.clientX-oDiv.offsetLeft;  var disY=oEvent.clientY-oDiv.offsetTop;  document.οnmοusemοve=function (ev)  {  var oEvent=ev||event;  oDiv.style.left=oEvent.clientX-disX+'px';  oDiv.style.top=oEvent.clientY-disY+'px';  }  document.οnmοuseup=function ()  {  document.οnmοusemοve=null;  document.οnmοuseup=null;  };  };  }
改为面向对象的过程
1. 去掉函数嵌套,将部分私有变量变为全局变量;
2. 将window.onolad 改为构造函数;
3. 将变量改为属性,函数改为方法
   window.οnlοad=function ()  {  new Drag('div1');  };  function Drag(id)  {  var _this=this;  this.disX = 0;  this.disY = 0;  this.oDiv=document.getElementById(id);  this.oDiv.οnmοusedοwn=function (ev)  {  _this.fnDown(ev);  return false;  };  };  Drag.prototype.fnDown=function (ev)  {  var oEvent=ev||event;  var _this=this;  this.disX=oEvent.clientX-this.oDiv.offsetLeft;  this.disY=oEvent.clientY-this.oDiv.offsetTop;  document.οnmοusemοve=function (ev)  {  _this.fnMove(ev);  };  document.οnmοuseup=function ()  {  _this.fnUp();  };  };  Drag.prototype.fnMove=function (ev)  {  var oEvent=ev||event;  this.oDiv.style.left=oEvent.clientX-this.disX+'px';  this.oDiv.style.top=oEvent.clientY-this.disY+'px';  };  Drag.prototype.fnUp=function ()  {  document.οnmοusemοve=null;  document.οnmοuseup=null;  }; 
面向对象改为继承的过程

1. 将需要继承的父类引用到外部

2. 继承父类中的方法属性

3. 写子类与父类不同的地方

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title><style>#div1 {background-color: #ccc; width: 200px; height: 200px;position: absolute;}#div2 {background-color: yellow; width: 200px; height: 200px;position: absolute;}</style><script src="Drag.js"></script><script>window.οnlοad=function ()  {  new Drag('div1');  new LimitDrag('div2');};  function LimitDrag(id)     {  Drag.call(this, id); //继承属性 this和id之间用逗号隔开  };  for(var i in Drag.prototype)  {  LimitDrag.prototype[i]=Drag.prototype[i];   //继承原型  }; LimitDrag.prototype.fnMove=function (ev)        //限制范围  {  var oEvent=ev||event;  var l=oEvent.clientX-this.disX;  var t=oEvent.clientY-this.disY;  if(l<0)  {  l=0;  }  else if(l>document.documentElement.clientWidth-this.oDiv.offsetWidth)  {  l=document.documentElement.clientWidth-this.oDiv.offsetWidth;  };  if(t<0)  {  t=0;  }  else if(t>document.documentElement.clientHeight-this.oDiv.offsetHeight)  {  t=document.documentElement.clientHeight-this.oDiv.offsetHeight;  }  this.oDiv.style.left=l+'px';  this.oDiv.style.top=t+'px';  }; </script></head>
<body><div id="div1">普通拖拽</div><div id='div2'>限制范围</div>
</body>
</html>

——系统对象

宿主对象(由浏览器提供的对象):DOM,BOM(在node中还有其他宿主对象)

本地对象和内置对象是JS本身具备的,与运行环境无关

本地对象(非静态对象):需要经过new (实例化)才能用,常用的有Object  Function  Array  String  Boolean  Number  Date  RegExp  Error等

内置对象(静态对象):不需要经过new,包括Math  Global

智能社JS学习笔记(七)相关推荐

  1. 智能社JS学习笔记(一)

    前言 转眼工作即将半年,这段时间自学了UI,html和css方面能比较熟练的掌握了,写过两套小程序的模板但只知其然不知其所以然(还是因为自己js基础知识掌握的不够啊)用bootstrap之类的框架能写 ...

  2. 智能社JS学习笔记(二)

    JS基础 --JS的组成 ECMAScript(ES) : 负责翻译,为js的核心,解释器. DOM (Document Object Model 文档对象模型):赋予js操作HTML的能力,docu ...

  3. Vue.js 学习笔记 七 控制样式

    Vue.js可以灵活的控制样式 我们首先随便写2个样式 <style>.divCss {background-color: green;width:400px;height:400px;} ...

  4. three.js学习笔记(七)——粒子

    粒子可以被用来创建星星.烟雾.雨滴.灰尘.火焰等等.我们可以使用合理的帧速率来创建数千个粒子.每个粒子都是由始终面向摄影机的平面(俩个三角形)组成的. 创建粒子 创建粒子和创建网格很像,不同的是粒子使 ...

  5. Node.js学习笔记(七)#Express框架

    目录 一.Express框架简介 二.安装和使用 1.安装 2.用express创建基本Web服务器 三.Express路由 1.路由概念 2.创建基本路由 ①.创建一个简单的get路由 ② 创建一个 ...

  6. Vue.js 学习笔记 八 v-for

    v-for指令,是用来循环的,常用的情况有以下4种 <div id="divApp"><!--迭代数字--><p v-for="n in 5 ...

  7. window的dos命令学习笔记 七

    文章目录 一.dos历史学习笔记(后期整合到这里,我想能学到这里的应该不多了,嘿嘿,加油) 二.执行状态返回值(`%errorlevel%`,和shell中`$?`相似): 三.视窗 1.color ...

  8. Vue.js学习系列七——Vue服务器渲染Nuxt学习

    我又回来啦~这次我们来学习Vue的服务器渲染SSR. 关于SSR的文章网上很多,一开始看得我云里雾里.然后去Vue.js 服务器渲染指南和nuxt官网看了看,发现文章大多都是搬运官网的内容,真正讲的清 ...

  9. ArcGIS JS 学习笔记4 实现地图联动

    原文:ArcGIS JS 学习笔记4 实现地图联动 1.开篇 守望屁股实在太好玩了,所以最近有点懒,这次就先写个简单的来凑一下数.这次我的模仿目标是天地图的地图联动. 天地的地图联动不仅地图有联动,而 ...

最新文章

  1. 卧槽,又一款Markdown组合神器!!!
  2. mybits注解详解
  3. 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
  4. jquery ajax下拉联动,基于jQuery Ajax实现下拉框无刷新联动
  5. 【Linux】Linux 中文出现乱码问题的解决
  6. 鸿蒙手机发布失败,华为:没有推出鸿蒙手机计划,「自拍」会让人觉得你孤独和失败...
  7. python解释器的安装
  8. 解决使用elementUI框架el-upload上传组件时session丢失问题
  9. zookeeper watcher机制
  10. 联想高校AI精英挑战赛移师冰城,哈工大上演人工智能创业大秀
  11. 博弈——无向图删边游戏
  12. matlab whos命令
  13. Azure KUDU工具
  14. None.js 第五步 Buffer(缓冲区)
  15. Java进阶:微服务SpringCloud
  16. graphpad做单因素方差分析_Graphpad做单因素方差分析步骤详解
  17. Linux下限制带宽的方法
  18. 【官档整理】原生 MSDN 纯净版 WIN PE 创建 下载方法
  19. 网络系列--SDN安全
  20. 非激活窗口(Inactive Window)

热门文章

  1. PLC工作原理及作用
  2. 车胎检测气压表胎压计芯片方案
  3. iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录无需密码)
  4. c语言设计黑白棋游戏,C语言黑白棋游戏[转载]
  5. 【数据库学习笔记】Day06 - 关系数据库规范化理论
  6. 【转载】LaTeX 各种命令和符号
  7. 有了3Dfind.it零部件搜索引擎,再不用重复画CAD零件图了
  8. 用python画一箭穿心_python turtle画一箭穿心
  9. 基于Android的高考志愿填报咨询系统APP
  10. 围观阿里ChatGTP---通义千问大模型测试