對象 : (黑盒子)不瞭解內部結構, 知道表面的各類操做.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>