对象 : (黑盒子)不了解内部结构, 知道表面的各类操做.javascript
面向对象 : 不了解原理的状况下 会使用功能 .java
面向对象是一种通用思想,并不是编程中能用,任何事情都能用.编程
封装 : 看不到里面的东西 , 用好表面功能.app
继承 : 从父类继承一些方法 , 属性 , 子类又有一些新的特性.dom
多态编程语言
抽象 : 抽取一个功能里面多个核心的功能模块。函数
思想: 高内聚、低耦合this
低耦合 :每一个功能模块之间耦合度要低spa
高内聚 :模块内部要紧密相连prototype
宿主对象、内置对象 (Math)、内部对象( new )
对象是经过构造函数构建出来的,对象用来存储数据
构造函数 -> 对象 -> 存储数据
普通函数若是内部没有return的时候 , 返回的是undefined
构造函数内部没有return返回值的时候,返回的构造出来的对象。
构造函数内部的this指向,指向的是当前对象。
总结:构造函数在new的时候构建对象,会在内部自动返回一个this 指向构造的对象。
1. 全局变量做为属性 2. 把对象的方法放在prototype 3. new实例化对象 4. this指向 function 构造函数名称 首字母大写(){ this.属性 = 属性值 //调用初始化方法 this.init(); } 构造函数名称 首字母大写 .prototype = { //初始化方法 : 整合各个功能模块 init : function(){ //调用绑定事件模块 this.eventBind(); }, fn1 : function(){ }, fn2 : function(){ }, eventBind : function(){ } } new 构造函数名称 首字母大写 ();
分析: 功能模块拆分 1: 图片移动 2:下一张的功能 3:上一张的功能 4:事件绑定模块 // 构造Banner函数 function Banner(){ this.oimgbox = document.querySelector('.imgbox'), this.oimg = document.querySelectorAll('img'), this.obtn = document.querySelectorAll('span'), this.distance = this.oimg[0].offsetWidth, this.count = 0 ; //调用初始化模块 this.init(); } // Banner.prototype = { //初始化模块 init : function(){ this.oimgbox.style.width = this.oimg.length * this.distance + 'px'; this.eventBind(); }, //图片移动模块 toimg : function(){ move(this.oimgbox,{'left': -this.distance * this.count}) }, //下一张 next : function(){ if(this.count >= this.oimg.length - 1){ this.count = 0; }else{ this.count++; } this.toimg(); }, //上一张 pre : function(){ if(this.count <= 0 ){ this.count = this.oimg.length - 1; }else{ this.count--; } this.toimg(); }, //事件绑定模块 eventBind : function(){ addEventListener(this.obtn[1],'click',this.next.bind(this)); addEventListener(this.obtn[0],'click',this.pre.bind(this)); } } new Banner();
function Tab(){ this.obtn = document.querySelectorAll('span'); this.oarticle = document.querySelectorAll('article'); this.init(); } Tab.prototype = { init : function(){ this.eventBind(); }, // 清除类名 clearClass : function(){ for(let i = 0 ,k = this.obtn.length; i < k; i++){ this.obtn[i].className = ''; this.oarticle[i].className = ''; } } , addClass :function(index){ this.clearClass(); this.obtn[index].className = 'active'; this.oarticle[index].className ='show'; }, eventBind : function(){ for(let i = 0, k = this.obtn.length; i<k; i++){ // this.obtn[i].addEventListener('click',this.addClass.bind(this,i)); this.obtn[i].addEventListener('click',this.addClass.bind(this,i)); } } } new Tab();
<div class="box">随机点名</div> <span class="btn">开始</span> 1.初始化 2.文字变化 定时器 3.开始 4.结束 5.判断何时开始,何时结束 6.控制flag 6.事件绑定 <script> var arr =['黄子韬','白敬亭','范世錡','黄景瑜','秦霄贤','彭昱畅','汪苏泷','侯明昊','秦凯旋']; function RandomName(){ this.box = document.querySelector('.box'); this.btn = document.querySelector('.btn'); this.flag = false; this.init(); } RandomName.prototype = { init : function(){ this.eventBind(); }, textChange : function(){ var _this = this; clearInterval(this.timer); this.timer = setInterval(function(){ //每隔一段事件生成一个下标 let num = parseInt(Math.random() * arr.length); //根据随机的下标 取到名字 而后交给 box; _this.box.innerHTML = arr[num]; //添加随机颜色 _this.box.style.color = randomColor(); },100) }, //开始 startTxt : function(){ this.btn.innerHTML = '开始'; }, //暂停 stopTxt : function(){ this.btn.innerHTML = '暂停'; }, //判断是否开始 isStart : function(){ if(this.flag){ this.textChange(); this.stopTxt(); }else{ clearInterval(this.timer); this.startTxt(); } }, //控制flag controlFlag : function(){ this.flag = this.flag ? false : true; //用flag控制 开始 或 暂停 this.isStart(); }, //evntBind: eventBind : function(){ this.btn.addEventListener('click',this.controlFlag.bind(this)); } } new RandomName(); </script>
function Drag(){ this.div = document.querySelector('div'); //定义一个空变量 this.fn = null; this.init(); } Drag.prototype ={ init : function(){ this.eventBind(); }, //鼠标按下 获取位置 Down : function(e){ e = e || window.event; this.x = e.offsetX; this.y = e.offsetY; //绑定鼠标移动事件 fn 调用 move() document.addEventListener('mousemove',this.fn = this.Move.bind(this)); document.addEventListener('mouseup',this.Up.bind(this)); }, //鼠标移动 Move : function(e){ e = e || window.event; let l = e.clientX - this.x, t = e.clientY - this.y; this.div.style.left = l +'px'; this.div.style.top = t + 'px'; }, //鼠标抬起 绑定事件不移动 Up : function(){ document.removeEventListener('mousemove',this.fn); }, eventBind : function(){ //鼠标按下 this.div.addEventListener('mousedown',this.Down.bind(this)); } } new Drag();
<script> function Banner(){ this.oimgbox = document.querySelector('.imgbox'); this.oimg = document.getElementsByTagName('img'); this.obtn = document.querySelectorAll('span'); this.ocricle = document.querySelector('.circlebox'); this.osection = document.querySelector('section'); this.timer = null; this.distance = this.oimg[0].offsetWidth; this.count = 0; this.init(); } Banner.prototype = { //初始化 init : function(){ this.clone(); this.autoplay(); this.setWidth(); this.addLi(); this.addClass(); this.eventBind(); }, setWidth : function(){ this.oimgbox.style.width = this.oimg.length * this.distance +'px'; }, //克隆图片 clone : function(){ this.firstimg = this.oimg[0].cloneNode(); this.oimgbox.appendChild(this.firstimg); }, // 图片移动 toImg : function(){ move(this.oimgbox,{'left' : -this.distance * this.count}); }, //下一张 next : function(){ if(this.count >= this.oimg.length -1){ this.oimgbox.style.left = 0; this.count = 1; }else{ this.count++; } this.toImg(); this.clearClass(); this.oli[this.count >= this.oimg.length -1 ? 0:this.count].className = 'active'; }, //上一张 pre : function(){ if(this.count <= 0){ this.oimgbox.style.left = -this.distance *(this.oimg.length - 1) + 'px'; this.count = this.oimg.length -2; }else{ this.count--; } this.toImg(); this.clearClass(); this.oli[this.count].className = 'active'; }, //定时器 autoplay : function(){ var _this = this; clearInterval(this.timer); this.timer = setInterval(() => { _this.next(); }, 3000); }, //清除定时器 clearTimer : function(){ clearInterval(this.timer); }, //添加圆点 addLi : function(){ for(let i = 0 ;i < this.oimg.length -1; i++){ this.createLi = document.createElement('li'); this.ocricle.appendChild(this.createLi); } this.oli = document.getElementsByTagName('li'); this.oli[0].className = 'active'; }, //清除类名 clearClass : function(){ for(let i = 0 ,k = this.oli.length;i<k;i++){ this.oli[i].className = ''; } }, addClass : function(){ for(let i = 0,k = this.oli.length;i<k;i++){ addEventListener(this.oli[i],'mouseover',()=>{ this.clearClass(); this.oli[i].className = 'active'; this.count = i; this.toImg(); }) } }, //事件调用 eventBind : function(){ addEventListener(this.obtn[0],'click',this.next.bind(this)); addEventListener(this.obtn[1],'click',this.pre.bind(this)); addEventListener(this.osection,'mouseover',this.clearTimer.bind(this)); addEventListener(this.osection,'mouseout',this.autoplay.bind(this)); } } new Banner(); </script>