JS高級(jí)

1.面向?qū)ο?/h1>
  • 工廠模式:很多功能或?qū)ο笮枰貜?fù)使用時(shí)氨肌,需要封裝成函數(shù)
  • 構(gòu)造函數(shù):當(dāng)用new去調(diào)用一個(gè)函數(shù)的時(shí)候恳守,這個(gè)函數(shù)就是構(gòu)造函數(shù)
// 工廠函數(shù)
function createPerson(name.sex){
  var obj=new Object();
  obj.name=name;
  obj.sex=sex;
  obj,show=function(){};
  return obj;
}

// 構(gòu)造函數(shù)
function createPerson(name.sex){
  this.name=name;
  this.sex=sex;
  this.show=function(){};
}

// 復(fù)制對(duì)象
function extend(obj1,obj2){
  for(var i in obj1){
    obj2[i]=obj1[i];
  }
}

2.原型

  • 原型:可以去改寫(xiě)對(duì)象下面共用的方法或?qū)傩裕尮灿玫姆椒ɑ驅(qū)傩栽趦?nèi)存中也存在一份(提高性能)
function 構(gòu)造函數(shù)(屬性1,屬性2){
  this.屬性1=屬性1;
  this.屬性2=屬性2;
}
構(gòu)造函數(shù).prototype.方法=function(){}
  • hasOwnProperty:查看是否是對(duì)象下面自身的屬性(永遠(yuǎn)不會(huì)去原型里尋找的屬性)
  • constructor:查看構(gòu)造函數(shù)蔽午,返回
  • instanceof:查看對(duì)象和構(gòu)造函數(shù)在原型鏈上是否有關(guān)系

3.繼承

  • 原型繼承
var a={
    name:'zhangsan'
};
var b=cloneObj(a);  //沒(méi)有用到new
function cloneObj(obj){
    //創(chuàng)建一個(gè)代理函數(shù)
    var F=function(){

    }
    F.prototype=obj;   //用代理函數(shù)接受要被繼承的對(duì)象
    return new F();   //返回的是代理函數(shù)的實(shí)例
}
alert(b.name);
b.name='李四';
alert(a.name);
  • 拷貝繼承
function CreatePerson(name,sex){
    this.name = name;
    this.sex = sex;
}
CreatePerson.prototype.showName = function(){
    alert(this.name);
}
var p1 = new CreatePerson("zhangsan","男");
//p1.showName();
//現(xiàn)在來(lái)一個(gè)學(xué)生類(lèi) 屬性:name,sex,address
//分析:一個(gè)學(xué)生類(lèi):屬性和方法 分開(kāi)繼
function Student(name,sex,address){
    //繼承父類(lèi)匕垫,人類(lèi) name,sex  this==>學(xué)生
    CreatePerson.call(this,name,sex);
    //name,sex繼承成功,把CreatePerson的th指向指向到當(dāng)前student類(lèi)
    this.address = address;
}
extend(CreatePerson.prototype,Student.prototype);
function extend(obj1,obj2){
    for(var attr in obj1){
        obj2[attr] = obj1[attr];
    }
}
var s1 = new Student("lisi","女","武漢");
s1.showName();

4.事件

  • 事件流
e.stopPropagation()/return false(只能使用在jq中)
阻止默認(rèn)事件:return false
  • 事件監(jiān)聽(tīng)
function (obj, eventType, fn) {
    if (obj.attachEvent) {
        obj.attachEvent('on' + eventType, fn);
    } else {
        obj.addEventListener(eventType, fn, false);
    }
}
  • 事件委托
oUl.onmouseover = function (event) {
    var event = event || window.event; 
    var target = event.target||event.srcElement;  
    var nodeName=target.nodeName;
    if(nodeName.toLowerCase()=='li'){
        target.style.background = 'green';
    }
}

5.原生ajax

// 實(shí)例化造壮,配置請(qǐng)求信息伟众,發(fā)送請(qǐng)求筹煮,設(shè)置回調(diào)函數(shù)
// 分析:
// 期望:ajax(method,url,data,success)

/**
 * ajax封裝
 * @param {*} method get/post 
 * @param {*} url 請(qǐng)求資源路徑
 * @param {*} data 請(qǐng)求參數(shù)
 * @param {*} success 回調(diào)函數(shù) 
 */

function ajax(method, url, data, success) {
    // 1.實(shí)例化對(duì)象
    var xhr = null; //  實(shí)例化一個(gè)對(duì)象,初始值為空   new XMLHttpRequest();
    if (window.ActiveXObject) { //IE5IE6是以ActiveXObject的方式引入XMLHttpRequest
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    } else if (window.XMLHttpRequest) { //除IE5 IE6以外的瀏覽器XMLHttpRequest
        xhr = new XMLHttpRequest(); //實(shí)例化一個(gè)XMLHttpRequest
    }

    // 2.配置信息 open()
    if (method == 'GET' && data) { //判斷data存在并且是GET方式
        url += '?' + data;
    }
    xhr.open(method, url, true);

    // 3.發(fā)送請(qǐng)求 send(),如果是POST方式沟饥,參數(shù)寫(xiě)在括號(hào)里
    if (method == 'GET') {
        xhr.send();
    } else if (method == 'POST') {
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
        xhr.send(data);
    }

    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                // 如果回調(diào)函數(shù)不為空添怔,就執(zhí)行這個(gè)回調(diào)函數(shù)艾杏,該函數(shù)有一個(gè)參數(shù)xhr.responseText就是返回的內(nèi)容
                success && success(xhr.responseText);
            }
        }
    }
}

6.跨域

  • 跨域:同源策略的影響糜颠,解決方式
    動(dòng)態(tài)創(chuàng)建script標(biāo)簽(jsonp)只能解決get方式的跨域
    var oBtn=document.getElementById('btn');
    oBtn.onclick=function(){
        // 點(diǎn)擊的瞬間,創(chuàng)建scrpt標(biāo)簽
        var oScript=document.createElement('script');
        oScript.src='1.txt';
        document.body.appendChild(oScript);
    }

--------------------------------------------------------------------
    // fn相當(dāng)于回調(diào)函數(shù)穆端,請(qǐng)求成功執(zhí)行的事件
    function fn(data){
        // data就是獲取過(guò)來(lái)的數(shù)據(jù)
        // alert(data);
        for(var i=0;i<data.length;i++){
            var oDiv=document.createElement('div');
            oDiv.innerHTML=data[i];
            document.body.appendChild(oDiv);
        }
    }

7.封裝tab選項(xiàng)卡

function Tab(id){
    //this=>實(shí)例對(duì)象 這個(gè)實(shí)例對(duì)象下面有三個(gè)屬性
    this.oParent = document.getElementById(id);
    this.aInput = this.oParent.getElementsByTagName("input");
    this.aDiv = this.oParent.getElementsByTagName("div");
}
Tab.prototype.init=function(){
    var This = this;//存儲(chǔ)tab實(shí)例對(duì)象
    for(var i = 0; i<this.aInput.length; i++){
        this.aInput[i].index = i;//添加自定義屬性
        this.aInput[i].onclick = function(){
            //this==>btn,期望實(shí)例對(duì)象去掉用change
            This.change(this);
        }
    }
}
Tab.prototype.change = function(obj){
    for(var j = 0; j<this.aInput.length; j++){
        //aInput[j] aDiv[j]
        this.aInput[j].className="";
        this.aDiv[j].style.display = "none";
    }
    obj.className = "active";//這里的this期望指的是btn
    //當(dāng)this發(fā)生沖突的時(shí)候威恼,保大對(duì)象
    this.aDiv[obj.index].style.display = "block";
}

window.onload = function(){
    var t1 = new Tab("div1");
    t1.init();
    var t2 = new Tab("div2");
    t2.init();
    var t3 = new Tab("div3");
    t3.init();
}

8.閉包

  • 閉包不會(huì)產(chǎn)生垃圾回收寝并,函數(shù)在執(zhí)行完畢之后會(huì)去查看這個(gè)函數(shù)在其他地方有沒(méi)有被引用如果有箫措,就不會(huì)GC產(chǎn)生垃圾回收,如果沒(méi)有就會(huì)自動(dòng)垃圾回收
  • 本來(lái)一個(gè)函數(shù)內(nèi)部是無(wú)法訪問(wèn)外部函數(shù)的變量的衬潦。閉包就是在這個(gè)外部函數(shù)里面定義一個(gè)內(nèi)部函數(shù)斤蔓,通過(guò)這個(gè)內(nèi)部函數(shù)使用變量,進(jìn)而給外部函數(shù)使用
  • 表現(xiàn)形式:全局變量镀岛,return,傳參
  • 閉包使用不當(dāng)會(huì)產(chǎn)生內(nèi)存泄漏
    // 第一種方式 return
    function fn1(){
        var a=2;
        return function (){
            console.log(a);   //內(nèi)部函數(shù)可以訪問(wèn)a
        }   //返回的結(jié)果是f函數(shù)
    }
    fn1()(); 



    // 第二種方式 傳參
    function fn1(){
        var a=5;
        function f(){
            console.log(a);
        }
        bar(f);
    }
    //定義bar,也要定義一個(gè)形參,傳進(jìn)一個(gè)函數(shù)弦牡,就去執(zhí)行一個(gè)函數(shù)
    function bar(fn){
        fn();
    }
    fn1();


    // 第三種方式 全局變量
    var fn;
    function fn1(){
        var a=1;
        function f(){
            console.log(a);
        }
        fn=f;   //把函數(shù)賦值給全局,這里產(chǎn)生了閉包
    }
    fn1();
    fn();

9.封裝cookie

/**
 * 
 * @param {*} key   鍵
 * @param {*} value  值
 * @param {*} day  過(guò)期的天數(shù)
 */

// 設(shè)置cookie
function setCookie(key, value, day) {
    var oDate = new Date();
    oDate.setDate(oDate.getDate() + day);
    document.cookie=key+'='+value+';expires='+oDate.toGMTString();
}
// setCookie('class','aaa',10);

/**
 * 
 * @param {*} key 鍵
 */

// 獲取cookie
function getVal(key){
    var str=document.cookie;
    var a=str.split('; ');   // 注意這里有一個(gè)空格
    console.log(a);
    for(let i=0;i<a.length;i++){
        var b=a[i];
        var c=b.split('=');
        console.log(c);
        if(c[0]==key){
            return decodeURI(c[1]);
        }
    }
}
// getVal('class');
// alert(getVal('class'));



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漂羊,一起剝皮案震驚了整個(gè)濱河市驾锰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌走越,老刑警劉巖椭豫,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赏酥,警方通過(guò)查閱死者的電腦和手機(jī)喳整,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裸扶,“玉大人框都,你說(shuō)我怎么就攤上這事『浅浚” “怎么了魏保?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)何荚。 經(jīng)常有香客問(wèn)我囱淋,道長(zhǎng),這世上最難降的妖魔是什么餐塘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任妥衣,我火速辦了婚禮,結(jié)果婚禮上戒傻,老公的妹妹穿的比我還像新娘税手。我一直安慰自己,他們只是感情好需纳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布芦倒。 她就那樣靜靜地躺著,像睡著了一般不翩。 火紅的嫁衣襯著肌膚如雪兵扬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天口蝠,我揣著相機(jī)與錄音器钟,去河邊找鬼。 笑死妙蔗,一個(gè)胖子當(dāng)著我的面吹牛傲霸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眉反,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昙啄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寸五?” 一聲冷哼從身側(cè)響起梳凛,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎播歼,沒(méi)想到半個(gè)月后伶跷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掰读,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年叭莫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹈集。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雇初,死狀恐怖拢肆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靖诗,我是刑警寧澤郭怪,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站刊橘,受9級(jí)特大地震影響鄙才,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜促绵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一攒庵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败晴,春花似錦浓冒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至慢味,卻和暖如春场梆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯路。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工辙谜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人感昼。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像罐脊,于是被迫代替她去往敵國(guó)和親定嗓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容