久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

JS對象封裝的常用方式-創(chuàng)新互聯(lián)

JS是一門面向?qū)ο笳Z言,其對象是用prototype屬性來模擬的,下面,來看看如何封裝JS對象.

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)科爾沁右翼中免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

常規(guī)封裝

function Person (name,age,sex){    this.name = name;    this.age = age;    this.sex = sex;
}

Pserson.prototype = {    constructor:Person,
    sayHello:function(){        console.log('hello');
    }
}

這種方式是比較常見的方式,比較直觀,但是Person() 的職責(zé)是構(gòu)造對象,如果把初始化的事情也放在里面完成,代碼就會顯得繁瑣,如果放在一個方法里初始化會不會好點呢?

升級版 (常見)

function Person (info){    this._init_(info);
}

Pserson.prototype = {    constructor : Person,
    _init_ : function(info) {        this.name = info.name;        this.age = info.age;        this.sex = info.sex;
    }
    sayHello:function(){        console.log('hello');
    }
}

可是,說到這里就發(fā)現(xiàn),name,age,sex 并沒有在Person里面申明,哪來的呢???

new 的執(zhí)行原理

new 的執(zhí)行過程可以用下面一個函數(shù)來代替

    var myNew = function(constructor, args) {
        var o = {};
        o.__proto__ = constructor.prototype;        var res = constructor.apply(o, args);        var type = typeof res;        if (['string', 'number', 'boolean', 'null', 'undefined'].indexOf(type) !== -1) {
            return o;
        }
        return res;
    }

解釋:
首先通過 var o = {} 構(gòu)造一個空對象.
然后將 構(gòu)造函數(shù)的原型屬性prototype賦值給o 的原型對象__proto__ 。這樣,在執(zhí)行 this.init(info); 這句話的時候,對象 o 就可以在其原型對象中查找_init_ 方法。(原型鏈)。
之后這句話 就是精髓了。

var res = constructor.apply(o,args);

以o為上下文調(diào)用函數(shù),同時將參數(shù)作為數(shù)組傳遞。那么,

 this._init_(info);

這句話就會被 o 執(zhí)行,
函數(shù)

    _init_ : function(info) {        this.name = info.name;        this.age = info.age;        this.sex = info.sex;
    }

以 o 為上下文調(diào)用,o也將擁有自己的 name,age,sex 屬性。

如果在構(gòu)造函數(shù)中,return 復(fù)合類型,包括對象,函數(shù),和正則表達(dá)式,那么就會直接返回這個對象,否則,返回 o 。

 var type = typeof res;    if(['string','number','boolean','null','undefined'].indexOf(type) !== -1){        return o;
    }    return res;

測試一下

    function Person(name) {        this.name = name;
    }
    Person.prototype.sayHello = function() {        console.log(this.name);
    }    var o1 = myNew(Person, ['pawn']);    console.log(o1);
    o1.sayHello();

JS 對象封裝的常用方式

OK 吧

類jQuery 封裝

這種方式是我從 jQuery 那里學(xué)來的。

jQuery 對象具有很強(qiáng)的集成性,可以作為函數(shù)調(diào)用,也可以做為對象調(diào)用,當(dāng)作為函數(shù)調(diào)用的時候,她可以無需 new 而返回它的一個實例,很方便。

先看代碼

var Person = function(info){    return new Person.prototype.init(info);
}

Person.prototype = {    constructor: Person,
    init:function(){        this.name = info.name.
    }
}
Person.prototype.init.prototype = Person.prototype;

這種封裝方式非常巧妙。
將對象的構(gòu)造操作放在函數(shù)的里面,而自己充當(dāng)一個工廠。
不斷調(diào)用 prototype 并不是一個直觀的做法,于是

var Person = function(info){    return new Person.fn.init(info);
}

Person.fn = Person.prototype = {    constructor: Person,
    init:function(){        this.name = info.name;        this.sayHello = function(){            this.makeArray();
        }
    }
    makeArray:function(){        console.log(this.name);
    }
}// 這句話的作用 
// 雖然把makeArray 等常用方法掛載到 Person.prorotype 下面,但還是會被 init 這個實例使用.
Person.fn.init.prototype = Person.fn;

最后用 閉包 封裝起來

    var Person = (function(window) {        var Person = function(name) {            return new Person.fn.init(name);
        }

        Person.fn = Person.prototype = {            constructor: Person,
            init: function(name) {                this.name = name;                this.sayHello = function() {                    this.makeArray();
                }
            },
            makeArray: function() {                console.log(this.name);
            }
        }

        Person.fn.init.prototype = Person.fn;        return Person;
    })();

測試一下

    var p = Person('pawn');    console.log(p);
    p.sayHello();

JS 對象封裝的常用方式

object.create();

最后js也提供了一種構(gòu)造對象的方式,object.create(); 可以傳遞一個對象Person,構(gòu)造一個p,并且使p 繼承Person.

    var Person = {
        name: 'pawn',
        sayHello: function() {            console.log(this.name);
        }
    }    var p = Object.create(Person);    console.log(p);
    p.sayHello();

結(jié)果
JS 對象封裝的常用方式

可以看到,對象Person的屬性成為了p的原型屬性,也就是說 p 原型繼承自 Person !

我們可以實現(xiàn)一個 Object.create()

Object.create = function(prototype){   function Func(){};
   Func.prototype = prototype;   var o = new Func();   return o;
}

在這里,我們將 Person 作為 構(gòu)造函數(shù)的 原型屬性,就可以構(gòu)造出 以Person 為原型對象的對象.

測試一下

JS 對象封裝的常用方式

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:JS對象封裝的常用方式-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://sd-ha.com/article46/shpeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站營銷、軟件開發(fā)、全網(wǎng)營銷推廣網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司