国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js對(duì)象創(chuàng)建方法匯總及對(duì)比

piapia / 2917人閱讀

摘要:中創(chuàng)建對(duì)象的方式有很多,尤其是基于原型的方式創(chuàng)建對(duì)象,是理解基于原型繼承的基礎(chǔ)。該函數(shù)中的屬性指向該源性對(duì)象當(dāng)通過該函數(shù)的構(gòu)造函數(shù)創(chuàng)建一個(gè)具體對(duì)象時(shí),在這個(gè)對(duì)象中,就會(huì)有一個(gè)屬性指向原型。

js中創(chuàng)建對(duì)象的方式有很多,尤其是基于原型的方式創(chuàng)建對(duì)象,是理解基于原型繼承的基礎(chǔ)。因此在這里匯總一下,并對(duì)各種方法的利弊進(jìn)行總結(jié)和對(duì)比,不至于以后對(duì)這些概念有模糊。

簡單方式創(chuàng)建
var o = new Object();

我們都知道,實(shí)際上在javascript中并沒有所謂的類的概念。因此在創(chuàng)建對(duì)象時(shí)不能像面向?qū)ο笳Z言那樣,通過類A new出來一個(gè)a對(duì)象。但是javascript有一個(gè)特殊的Object。我們可以借助Object來new一個(gè)對(duì)象。
然后可以通過如下方式給對(duì)象增加屬性或方法:

    o.name="abc";

但是因?yàn)闆]有類的約束,這種方式創(chuàng)建出來的對(duì)象無法實(shí)現(xiàn)對(duì)象的重復(fù)利用,并且沒有一種固定的約數(shù),操作起來可能會(huì)出現(xiàn)這樣或者那樣的意想不到的問題。
有這樣一個(gè)例子:

    var a = new Object;  
    var b = new Object;  
    var c = new Object;  
    c[a]=a;  
    c[b]=b;  
    alert(c[a]===a); //輸出什么

關(guān)于這個(gè)例子的具體解答詳見 例子出處

工廠方法創(chuàng)建

直接看一個(gè)例子:

    function createPerson(){
        var o = new Object();
        o.name = "abc";
        o.age = 20;
        return o;    
    }

這種創(chuàng)建對(duì)象的方法是在一個(gè)function中new Object(),并且賦予屬性和方法,最后return 帶有這些屬性和方法的對(duì)象。

但是當(dāng)我們想通過

    var p1 = createPerson();
    alert(typeof(p1));//Object 僅能得到這個(gè)結(jié)果,實(shí)際上沒有太大意義
    alert(p1 instanceof(類名???))//會(huì)發(fā)現(xiàn)其實(shí)并不存在一個(gè)Person類
構(gòu)造函數(shù)的方式
    function Person(name,age){
        this.name = name;
        this.age = age;
        this.say = function(){
            //
        }
    }
    
    var p1 = new Person("abc",20);

構(gòu)造函數(shù)的方式創(chuàng)建的對(duì)象:

函數(shù)名即為類名

通過this來定義屬性

通過new Person()創(chuàng)建對(duì)象

并且有如下屬性:

    alert(typeof(p1));// Person
    alert(p1 instanceof(Person));// true

但是同時(shí)我們也發(fā)現(xiàn)這種方式創(chuàng)建對(duì)象的一個(gè)弊端。對(duì)于類中的say方法,每分配一個(gè)對(duì)象就會(huì)有一個(gè)say的內(nèi)存空間被分配出來。有一個(gè)say的拷貝。如果方法特別多的時(shí)候,會(huì)造成內(nèi)存空間的極大浪費(fèi)。可以通過兩種方式進(jìn)行優(yōu)化和改進(jìn):

將say聲明為全局的

    function say(){
    
    }

然后在類的定義中通過:

    this.say = say;

采用下面提到的基于原型的方式創(chuàng)建對(duì)象

讓類中的行為統(tǒng)一指向全局的say方法。但是如果將所有的方法設(shè)為全局的時(shí)候,就可以被window對(duì)象調(diào)用,那么就破壞了對(duì)象的封裝性;如果方法很多,會(huì)造成代碼中充斥著大量的全局函數(shù)。

基于原型創(chuàng)建對(duì)象
    function Person(){
        
    }
    Person.prototype.name = "abc";
    Person.prototype.age= 20;
    Person.prototype.say= function(){
        alert(this.name+this.age);
    }
    
    
    var p1 = new Person();
    p1.say();//ok
    say();//no 完成了封裝
    

原型是js中的一個(gè)特殊對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建之后,會(huì)隨之產(chǎn)生一個(gè)原型對(duì)象。該函數(shù)中的prototype屬性指向該源性對(duì)象;
當(dāng)通過該函數(shù)的構(gòu)造函數(shù)創(chuàng)建一個(gè)具體對(duì)象時(shí),在這個(gè)對(duì)象中,就會(huì)有一個(gè)_prop_屬性指向原型。這些是js中的很重要的一種繼承方式--基于原型的繼承的基礎(chǔ)。這里不再贅述。

基于原型創(chuàng)建對(duì)象時(shí),如果對(duì)象的屬性和方法特別多時(shí),可以通過如下方式進(jìn)行定義:

    Person.prototype = {
        name:"abc",
        age:20,
        say:function(){
        
        }
    }

稱為原型重寫。原型重寫之后當(dāng)我們再通過 var p1 = new Person()創(chuàng)建一個(gè)對(duì)象時(shí),p1 的constructor != Person()了。由于原型重寫了,而且沒有通過prototype指向,從而指向了Object()。
如果constructor比較重要,可以再json格式的定義中手動(dòng)制定

    constructor:Pserson

關(guān)于原型重寫,我畫了個(gè)示意圖,比較容易理解:

p1是原型重寫前聲明的對(duì)象,p2是原型重寫

    Person.prototype.name = "123";

之后的聲明的對(duì)象。
可以看出

constructor的指向確實(shí)沒有自動(dòng)變換,除非通過上述手動(dòng)的方式進(jìn)行修改。

通過p2.name = "456",設(shè)置name時(shí),會(huì)在自己的存儲(chǔ)空間中存儲(chǔ)。當(dāng)然查找name屬性時(shí),也是從自己的內(nèi)存空間中讀取name值。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85977.html

相關(guān)文章

  • Node.js運(yùn)行原理、高并發(fā)性能測試對(duì)比生態(tài)圈匯總

    摘要:模式,單實(shí)例多進(jìn)程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進(jìn)程業(yè)務(wù)代碼。就是我們需要一個(gè)調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    kamushin233 評(píng)論0 收藏0
  • Node.js運(yùn)行原理、高并發(fā)性能測試對(duì)比生態(tài)圈匯總

    摘要:模式,單實(shí)例多進(jìn)程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進(jìn)程業(yè)務(wù)代碼。就是我們需要一個(gè)調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    BDEEFE 評(píng)論0 收藏0
  • Node.js運(yùn)行原理、高并發(fā)性能測試對(duì)比生態(tài)圈匯總

    摘要:模式,單實(shí)例多進(jìn)程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進(jìn)程業(yè)務(wù)代碼。就是我們需要一個(gè)調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    TesterHome 評(píng)論0 收藏0
  • 前端面試匯總VUE(二)

    摘要:采用了新舊的對(duì)比,獲取差異的,最后一次性的更新到真實(shí)上。對(duì)基本屬性進(jìn)行監(jiān)聽對(duì)對(duì)象進(jìn)行監(jiān)聽對(duì)對(duì)象某一個(gè)屬性監(jiān)聽監(jiān)聽自定義指令全局指令,第一個(gè)參數(shù)是指令名,第二個(gè)參數(shù)是一個(gè)對(duì)象,對(duì)象內(nèi)部有個(gè)的函數(shù),函數(shù)里有這個(gè)參數(shù),表示綁定了這個(gè)指令的元素。 11.vue 虛擬DOM的理解 Web界面由DOM樹(樹的意思是數(shù)據(jù)結(jié)構(gòu))來構(gòu)建,當(dāng)其中一部分發(fā)生變化時(shí),其實(shí)就是對(duì)應(yīng)某個(gè)DOM節(jié)點(diǎn)發(fā)生了變化,??...

    Sanchi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<