摘要:基礎(chǔ)知識(shí)變量聲明數(shù)據(jù)類型類型轉(zhuǎn)換基礎(chǔ)教程變量他是用于存儲(chǔ)信息的一個(gè)容易規(guī)則他是敏感大小寫的和他是個(gè)不同的變量變量名字必須以字母或者下劃線開(kāi)始數(shù)字不可以你不用在中創(chuàng)建這個(gè)動(dòng)作經(jīng)常揮別稱之為聲明您可以通過(guò)語(yǔ)句來(lái)聲明變量注意的地方如果變量再次被定
基礎(chǔ)知識(shí)
變量,聲明,數(shù)據(jù)類型,
類型轉(zhuǎn)換
/** * 基礎(chǔ)教程 */ (function(){ /** * 變量 * 他是用于存儲(chǔ)信息的一個(gè)容易 * 規(guī)則 * 他是敏感大小寫的 (Y和y他是2個(gè)不同的變量) * 變量名字必須以字母或者下劃線開(kāi)始 數(shù)字不可以 $("#id") */ x = 5; length = 66.15; // 你不用var var k = "YUNFENGCHENG"; alert(k) k = "USPCAT.COM"; //在javascript中 創(chuàng)建這個(gè)動(dòng)作經(jīng)常揮別稱之為"聲明" //您可以通過(guò)var 語(yǔ)句來(lái)聲明jS變量 var x = "44"; var carname; //注意的地方 //如果變量再次被定義一會(huì)他的原始數(shù)值將不被持有 })()
/** * 數(shù)據(jù)類型和類型轉(zhuǎn)換 */ (function(){ /** * 基本數(shù)據(jù)類型(3種) * (1)數(shù)字 number * 例如 3.1415927 ,0.251,.2,100,1.478E * (2)字符串 * string * (3)布爾 booble */ //數(shù)字型轉(zhuǎn)字符串 var num1 = 3.1415927; var str1 = Number.toString(num1); document.write(typeof str1 == "string");//true document.write("
") //四舍五入 var num2 = num1.toFixed(2); document.write(num2); document.write("
") //返回指定的為數(shù)的數(shù)字 var num3 = num1.toPrecision(4); document.write(num3); document.write("
") //(Math) 介紹一點(diǎn)方法 //四舍五入round document.write(Math.round(4.7)); document.write("
") //隨機(jī)出處理0~1 document.write(Math.random()); document.write("
") //0~10的隨機(jī)數(shù) document.write(Math.floor((Math.random()*11))); document.write("
") document.write("-------------------------------
") //字符串 //注意(轉(zhuǎn)義) pca"t 要輸入 pca"t 換行 /** " " & 和好+ 回車 f 換頁(yè) */ //屬性 length indexof substring chartAt(整數(shù)) //如何轉(zhuǎn)成數(shù)字 var str2 = "USPCAT.COM"; var str3 = "3.14"; var number = Number(str3); document.write(typeof number == "number"); document.write("
") document.write((str2 - 0)+"
");//NaN 非數(shù)值 document.write((str3 - 1)+"
");//如果是減法他回自動(dòng)將字符串轉(zhuǎn)成數(shù)字 document.write((str3 + 1)+"
");//加法會(huì)當(dāng)成字符串的拼接操作 //布爾類型(boolean) //true | false var s = ""; var o = {};//true var l = [];//true var n = null; var f = false; var u = undefined; document.write("-------------------------------
") if(!s){ document.write("s is false
") } if(!o){ document.write("o is false
") } if(!l){ document.write("l is false
") } if(!n){ document.write("n is false
") } if(!f){ document.write("f is false
") } if(!u){ document.write("u is false
") } /** s is false f is false u is false n is false */ if(str != "" && str != null && str != undefined){ //... } if(str){ //... } /** * 2復(fù)合類型 * (1)數(shù)組-->有序的集合(array):下標(biāo)(index) 是從0開(kāi)始的 * 例子 * var arr = new Array(); * (2)特殊的對(duì)象-->函數(shù)(function) */ /** * 特殊值 * (1)null 不是有效的對(duì)象數(shù)組數(shù)組字符串 他們?yōu)榭? * (2)undefined 他是代表沒(méi)有定義 和空不是一個(gè)概念 * [沒(méi)有] 但是有容易 有一個(gè)盒子但是盒子里賣沒(méi)有東西 * undefined 連盒子也沒(méi)有 */ /** * 內(nèi)置特殊對(duì)象 * Data對(duì)象 * Error錯(cuò)誤對(duì)象 * ReExp對(duì)象 */ })()
/** * 數(shù)據(jù)類型和類型轉(zhuǎn)換 */ (function(){ /** * 2復(fù)合類型 * (1)數(shù)組-->有序的集合(array):下標(biāo)(index) 是從0開(kāi)始的 */ //屬性 //constructor 返回對(duì)創(chuàng)建次對(duì)象的數(shù)組的函數(shù)引用 //index //input //*length //方法 // *concat 合并數(shù)組 // *join 把數(shù)組按照一定的各式進(jìn)行串聯(lián) // *push 數(shù)組的追加 // *pop 刪除數(shù)組返回的最后一個(gè)元素 //sort toString shift 刪除并且返回?cái)?shù)組的第一個(gè)元素 var arr = new Array(); arr.push(1); arr.push(55); arr.push(5); arr.push(3); arr.push(9); //alert(arr.length) var arr2 = [1,2,3,45,6,7,8]; //alert(arr2.join(":")); //alert(arr.concat(arr2).toString()) for (var i = 0; i < arr2.length; i++) { document.write(arr2[i]+"高級(jí)類 繼承和聚合 接口
"); } //擴(kuò)展array的方法 Array.each = function(array,fn){ for (var i = 0; i < array.length; i++) { fn(array[i]) } } Array.each(arr2,function(v){ document.write(v+"
"); }) })()
1.注解的方法
2.屬性檢驗(yàn)法
3.鴨式變形法
/** * 1.注釋方法 * 最簡(jiǎn)單,但是功能也是最弱的 * 他利用inerface和implement"文字" * 把他們用注解的方式顯示的表現(xiàn)出來(lái) */ (function(){ /** * 用注釋來(lái)定義一個(gè)接口 * interface PersonDao(){ * function add(obj); * function remove(obj); * function find(id); * } */ //我們用注釋的方式來(lái)實(shí)現(xiàn)他 /** * PersonDaoImpl implement interface */ var PersonDaoImpl = function(){ } PersonDaoImpl.prototype.add = function(obj){ //.. } PersonDaoImpl.prototype.remove = function(obj){ //.. } PersonDaoImpl.prototype.find = function(id){ //.. } /** * 千萬(wàn)不要感覺(jué)他是沒(méi)有任何意義的 * 1.大型的項(xiàng)目靠得就是規(guī)范和標(biāo)準(zhǔn) * 2.這樣的寫法會(huì)交你的程序員在沒(méi)有寫實(shí)現(xiàn)之前有充分時(shí)間做代碼的設(shè)計(jì)和架構(gòu) * 3.缺點(diǎn):要認(rèn)為的遵守 */ })()
/** * 屬性檢驗(yàn)法 */ (function(){ /** * 用注釋來(lái)定義一個(gè)接口 * interface PersonDao(){ * function add(obj); * function remove(obj); * function find(id); * } */ //我們用注釋的方式來(lái)實(shí)現(xiàn)他 var PersonDaoImpl = function(){ this.implementInterface = ["PersonDao"]; } PersonDaoImpl.prototype.add = function(obj){ alert(obj) //.. } PersonDaoImpl.prototype.remove = function(obj){ //.. } PersonDaoImpl.prototype.find = function(id){ //.. } function addObj(obj){ var PersonDao = new PersonDaoImpl(); //開(kāi)始檢查 if(!impl(PersonDao,"PersonDao")){ throw new Error("類PersonDaoImpl沒(méi)有實(shí)現(xiàn)接口PersonDao"); }else{ PersonDao.add(obj); } } addObj("USCAPT.COM"); /** * 他接受的是一個(gè)不定參數(shù) */ function impl(Object){ //遍歷出入對(duì)象的屬性 for(var i=1;i /** * 3.鴨式變形法 * 這個(gè)方法來(lái)源于一個(gè)國(guó)外的老頭他有一個(gè)名言(jim) * "像鴨子一樣走路并且會(huì)嘎嘎叫的東西就是鴨子" * 換言之 * 如果對(duì)象具有與接口定義的方法名字的同命所有方法 那么我就認(rèn)為你就是實(shí)現(xiàn)本接口 */ (function(){ //定義一個(gè)接口類 var Interface = function(name,methods){ if(arguments.length != 2){ alert("interface must have two paramters..."); } this.name = name;//這個(gè)是接口的名字 this.methods = [];//定義個(gè)空數(shù)組來(lái)轉(zhuǎn)載函數(shù)名 for (var i = 0; i < methods.length; i++) { if(typeof methods[i] != "string"){ alert("method name must is String ...") }else{ this.methods.push(methods[i]) } } } //定義接口的一個(gè)靜態(tài)方法來(lái)實(shí)現(xiàn)接口與實(shí)現(xiàn)類的直接檢驗(yàn) //靜態(tài)方法不要寫成Interface.prototype.* 因?yàn)檫@是寫到接口原型連上的 //我們要把靜態(tài)的函數(shù)直接寫到類層次上 Interface.ensureImplements = function(object){ if(arguments.length<2){ alert("必須最少是2個(gè)參數(shù)"); return false; } //遍歷 for (var i = 1; i < arguments.length; i++) { var inter = arguments[i]; //如果你是接口就必須是Interface類型的 if(inter.constructor != Interface){ throw new Error("if is interface class must is Interface type"); } //遍歷函數(shù)集合并分析 for (var j = 0; j < inter.methods.length; j++) { var method = inter.methods[j]; //實(shí)現(xiàn)類中必須有方法名字 和 接口中所有的方法名項(xiàng)目 if(!object[method] || typeof object[method] != "function"){ throw new Error("實(shí)現(xiàn)類并且沒(méi)有完全實(shí)現(xiàn)接口中的所有方法..."); } } } } //應(yīng)用 //定義自己的接口 var GridMananger = new Interface("GridMananger",["add","remove","list"]); var FormMananger = new Interface("FormMananger",["save"]) function commManager(){ //先實(shí)現(xiàn)方法 this.add = function(){ alert("ok") } this.remove = function(){} this.list = function(){} this.save = function(){} //檢驗(yàn) Interface.ensureImplements(this,GridMananger,FormMananger) } var c = new commManager(); c.add(); /** * 接口的重要性 * 1.大型項(xiàng)目提高代碼的靈活度 * 2.松耦合 * 3.在團(tuán)隊(duì)開(kāi)發(fā)的時(shí)候,有寫時(shí)候你在真正編碼之前就可以寫API(自己的類庫(kù)) * 那這類庫(kù)就可以時(shí)候在進(jìn)行實(shí)現(xiàn) * 開(kāi)始的時(shí)候我們就可以對(duì)整個(gè)項(xiàng)目是否可行,通過(guò)接口就可模擬出來(lái) */ })()閉包門戶大開(kāi)類型
用命名規(guī)范區(qū)別私有和共有的方式
閉包
/** * 信息的隱藏是最終的目的,封裝只不過(guò)是隱藏的一種方法 */ (function(){ /** * 1.門戶大開(kāi)類型 * 2.用命名規(guī)范區(qū)別私有和共有的方式 * 3.閉包 */ //門戶打開(kāi)型 function Person(age,name){ this.name = name; if(!this.checkAge(age)){ throw new Error("年齡必須在0到150之間"); } this.age = age; } //var p = new Person(-10,"JIM"); //alert(p.age) //解決上述問(wèn)題 Person.prototype = { checkAge:function(age){ if(age>0 && age < 150){ return true; }else{ return false; } } } Person.prototype["getName"] = function(){ return this.name || "USPCAT.COM"; } //var p = new Person(-10,"JIM"); var p = new Person(27,"JIM"); var p2 = new Person(27); alert(p2.getName()); })()上面這種門戶大開(kāi)的都是公用的不是很好,應(yīng)該提前做好閉包
(function(){ //用命名規(guī)范來(lái)區(qū)別私有和共有變量 function Person(name,age,email){ //定義私有變量 this._name;//私有 this._age;//私有 this.setName(name); this.setAge(age); this.email = email;//共有 } Person.prototype = { setName:function(name){ this._name = name; }, setAge :function(age){ if(age>0 && age < 150){ this._age = age; }else{ throw new Error("年齡必須在0到150之間"); } } } var p = new Person("JIM",-1,"JIM@USPCAT.COM"); })()/** * 閉包實(shí)現(xiàn)封裝 */ (function(){ function person(name,age,email,sex){ this.email = email;//public 變量 //get this.getName = function(){ return this.name; } this.getAge = function(){ return this.age; } //set this.setName = function(name){ this.name = name } this.setAge = function(age){ if(age>0 && age < 150){ this.age = age }else{ throw new Error("年齡必須在0到150之間"); } } var _sex = "M";//這也是私有變量的編寫方式 this.getSex = function(){ return _sex; } this.setSex = function(){ _sex = sex } this.init = function(){ this.setName(name); this.setAge(age); } this.init(); } //ceshi var p = new person("JIM",-1,"www.USPCAT@126.COM") })()/** * 普通的屬性和函數(shù)是作用早對(duì)象上的 * 而靜態(tài)的函數(shù)是定義到類上面的 */ (function(){ function Person(name,age){ this.name = name; this.showName = function(){ alert(this.name) } } //第一種靜態(tài)函數(shù)的寫法 Person.add = function(x,y){ return x+y; } //alert(Person.add(10,20)) //第二種方式 //用類中類的方式完成沒(méi)一個(gè)對(duì)象全擁有相同的屬性和闡述 var cat = (function(){ //私有靜態(tài)屬性 var AGE = 10; //私有函數(shù) function add(x,y){ return x+y; } return function(){ this.AGE = AGE; this.add = function(x,y){ return add(x,y) } } })() alert(new cat().add(1,2)+" "+new cat().AGE); alert(new cat().AGE); /** * 1.保護(hù)內(nèi)部數(shù)據(jù)完整性是封裝一大用處 * 2.對(duì)象的重構(gòu)變得很輕松,(如果沒(méi)有封裝你感動(dòng)正在用這的代碼嗎?) * 3.弱化模塊直接的耦合 * 弊端 * 私有的方法他會(huì)變得很難進(jìn)行單元測(cè)試 * 使用封裝就會(huì)意味著與復(fù)雜的代碼打交道 * 最大問(wèn)題是封裝在javascript中是很難實(shí)現(xiàn)的 */ })()單體模式1.普通的單體
函數(shù)的鏈?zhǔn)秸{(diào)用 工廠模式 橋梁模式 門面模式 組合模式 適配模式 裝飾者 享元模式 代理模式 責(zé)任鏈模式 命令模式 觀察者模式 類引擎
2.具有局部變量的強(qiáng)大單體
3.惰性單體
4.分支單體
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87762.html
摘要:外觀模式在中常常用于解決瀏覽器兼容性問(wèn)題。實(shí)現(xiàn)外觀模式不僅簡(jiǎn)化類中的接口,而且對(duì)接口與調(diào)用者也進(jìn)行了解耦。外觀模式的優(yōu)勢(shì)是易于使用,而且本身也比較輕量級(jí)。 1. 簡(jiǎn)介 外觀模式(Facade)為子系統(tǒng)中的一組接口提供了一個(gè)一致的界面,此模塊定義了一個(gè)高層接口,這個(gè)接口值得這一子系統(tǒng)更加容易使用。外觀模式在JS中常常用于解決瀏覽器兼容性問(wèn)題。 2. 實(shí)現(xiàn) 外觀模式不僅簡(jiǎn)化類中的接口,而且...
摘要:簡(jiǎn)介橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。同時(shí)橋接模式也有自己的缺點(diǎn)大量的類將導(dǎo)致開(kāi)發(fā)成本的增加,同時(shí)在性能方面可能也會(huì)有所減少。 1. 簡(jiǎn)介 橋接模式(Bridge)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。其實(shí)就是函數(shù)的封裝,比如要對(duì)某個(gè)DOM元素添加color和backgroundColor,可以封裝個(gè)changeColor函數(shù),這樣可以在多個(gè)...
摘要:大潮來(lái)襲前端開(kāi)發(fā)能做些什么去年谷歌和火狐針對(duì)提出了的標(biāo)準(zhǔn),顧名思義,即的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁(yè),新的標(biāo)準(zhǔn)讓我們可以使用語(yǔ)言來(lái)開(kāi)發(fā)。 VR 大潮來(lái)襲 --- 前端開(kāi)發(fā)能做些什么 去年谷歌和火狐針對(duì) WebVR 提出了 WebVR API 的標(biāo)準(zhǔn),顧名思義,WebVR 即 web + VR 的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁(yè),新的 API 標(biāo)準(zhǔn)讓我們可以使用 ...
摘要:工廠模式定義一個(gè)用于創(chuàng)建對(duì)象的接口,這個(gè)接口由子類決定實(shí)例化哪一個(gè)類。實(shí)現(xiàn)一個(gè)簡(jiǎn)單的實(shí)現(xiàn),使用如果使用對(duì)象屬性來(lái)實(shí)現(xiàn)以下例子中的工廠方法接受在運(yùn)行時(shí)以字符串形式指定的類型,然后創(chuàng)建并返回所請(qǐng)求類型的對(duì)象。 1. 簡(jiǎn)介 工廠模式的目的是為了創(chuàng)建對(duì)象,它通常在類或者類的靜態(tài)方法中實(shí)現(xiàn),具有以下目標(biāo): 當(dāng)創(chuàng)建相似對(duì)象時(shí)執(zhí)行重復(fù)操作 當(dāng)編譯時(shí)不知道具體類型的情況下,為工廠客戶提供一個(gè)創(chuàng)建對(duì)象...
摘要:簡(jiǎn)介狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。狀態(tài)通常為一個(gè)或多個(gè)枚舉常量的表示。簡(jiǎn)而言之,當(dāng)遇到很多同級(jí)或者的時(shí)候,可以使用狀態(tài)模式來(lái)進(jìn)行簡(jiǎn)化。 1. 簡(jiǎn)介 狀態(tài)模式(State)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。其實(shí)就是用一個(gè)對(duì)象或者數(shù)組記錄一組狀態(tài),每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)實(shí)現(xiàn),實(shí)現(xiàn)的時(shí)候根據(jù)狀態(tài)挨個(gè)去運(yùn)...
摘要:簡(jiǎn)介抽象工廠模式就是通過(guò)類的抽象使得業(yè)務(wù)適用于一個(gè)產(chǎn)品類簇的創(chuàng)建,而不負(fù)責(zé)某一類產(chǎn)品的實(shí)例。通過(guò)抽象工廠,就可以創(chuàng)建某個(gè)類簇的產(chǎn)品,并且也可以通過(guò)來(lái)檢查產(chǎn)品的類別,也具備該類簇所必備的方法。 0. 簡(jiǎn)介 抽象工廠模式(Abstract Factory)就是通過(guò)類的抽象使得業(yè)務(wù)適用于一個(gè)產(chǎn)品類簇的創(chuàng)建,而不負(fù)責(zé)某一類產(chǎn)品的實(shí)例。 JS中是沒(méi)有直接的抽象類的,abstract是個(gè)保留字,但...
閱讀 2591·2021-09-26 10:17
閱讀 3221·2021-09-22 15:16
閱讀 2131·2021-09-03 10:43
閱讀 3258·2019-08-30 11:23
閱讀 3658·2019-08-29 13:23
閱讀 1301·2019-08-29 11:31
閱讀 3686·2019-08-26 13:52
閱讀 1394·2019-08-26 12:22