智能社JS学习笔记(七)
面向对象基础
——定义:在不了解原理的情况下,会使用功能
——对象:不了解内部的结构,知道表面的各种操作(按钮),如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学习笔记(七)相关推荐
- 智能社JS学习笔记(一)
前言 转眼工作即将半年,这段时间自学了UI,html和css方面能比较熟练的掌握了,写过两套小程序的模板但只知其然不知其所以然(还是因为自己js基础知识掌握的不够啊)用bootstrap之类的框架能写 ...
- 智能社JS学习笔记(二)
JS基础 --JS的组成 ECMAScript(ES) : 负责翻译,为js的核心,解释器. DOM (Document Object Model 文档对象模型):赋予js操作HTML的能力,docu ...
- Vue.js 学习笔记 七 控制样式
Vue.js可以灵活的控制样式 我们首先随便写2个样式 <style>.divCss {background-color: green;width:400px;height:400px;} ...
- three.js学习笔记(七)——粒子
粒子可以被用来创建星星.烟雾.雨滴.灰尘.火焰等等.我们可以使用合理的帧速率来创建数千个粒子.每个粒子都是由始终面向摄影机的平面(俩个三角形)组成的. 创建粒子 创建粒子和创建网格很像,不同的是粒子使 ...
- Node.js学习笔记(七)#Express框架
目录 一.Express框架简介 二.安装和使用 1.安装 2.用express创建基本Web服务器 三.Express路由 1.路由概念 2.创建基本路由 ①.创建一个简单的get路由 ② 创建一个 ...
- Vue.js 学习笔记 八 v-for
v-for指令,是用来循环的,常用的情况有以下4种 <div id="divApp"><!--迭代数字--><p v-for="n in 5 ...
- window的dos命令学习笔记 七
文章目录 一.dos历史学习笔记(后期整合到这里,我想能学到这里的应该不多了,嘿嘿,加油) 二.执行状态返回值(`%errorlevel%`,和shell中`$?`相似): 三.视窗 1.color ...
- Vue.js学习系列七——Vue服务器渲染Nuxt学习
我又回来啦~这次我们来学习Vue的服务器渲染SSR. 关于SSR的文章网上很多,一开始看得我云里雾里.然后去Vue.js 服务器渲染指南和nuxt官网看了看,发现文章大多都是搬运官网的内容,真正讲的清 ...
- ArcGIS JS 学习笔记4 实现地图联动
原文:ArcGIS JS 学习笔记4 实现地图联动 1.开篇 守望屁股实在太好玩了,所以最近有点懒,这次就先写个简单的来凑一下数.这次我的模仿目标是天地图的地图联动. 天地的地图联动不仅地图有联动,而 ...
最新文章
- 卧槽,又一款Markdown组合神器!!!
- mybits注解详解
- 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
- jquery ajax下拉联动,基于jQuery Ajax实现下拉框无刷新联动
- 【Linux】Linux 中文出现乱码问题的解决
- 鸿蒙手机发布失败,华为:没有推出鸿蒙手机计划,「自拍」会让人觉得你孤独和失败...
- python解释器的安装
- 解决使用elementUI框架el-upload上传组件时session丢失问题
- zookeeper watcher机制
- 联想高校AI精英挑战赛移师冰城,哈工大上演人工智能创业大秀
- 博弈——无向图删边游戏
- matlab whos命令
- Azure KUDU工具
- None.js 第五步 Buffer(缓冲区)
- Java进阶:微服务SpringCloud
- graphpad做单因素方差分析_Graphpad做单因素方差分析步骤详解
- Linux下限制带宽的方法
- 【官档整理】原生 MSDN 纯净版 WIN PE 创建 下载方法
- 网络系列--SDN安全
- 非激活窗口(Inactive Window)