摘要:中創(chuàng)建對象的方式有很多,尤其是基于原型的方式創(chuàng)建對象,是理解基于原型繼承的基礎(chǔ)。該函數(shù)中的屬性指向該源性對象當(dāng)通過該函數(shù)的構(gòu)造函數(shù)創(chuàng)建一個具體對象時,在這個對象中,就會有一個屬性指向原型。
js中創(chuàng)建對象的方式有很多,尤其是基于原型的方式創(chuàng)建對象,是理解基于原型繼承的基礎(chǔ)。因此在這里匯總一下,并對各種方法的利弊進行總結(jié)和對比,不至于以后對這些概念有模糊。
簡單方式創(chuàng)建var o = new Object();
我們都知道,實際上在javascript中并沒有所謂的類的概念。因此在創(chuàng)建對象時不能像面向?qū)ο笳Z言那樣,通過類A new出來一個a對象。但是javascript有一個特殊的Object。我們可以借助Object來new一個對象。
然后可以通過如下方式給對象增加屬性或方法:
o.name="abc";
但是因為沒有類的約束,這種方式創(chuàng)建出來的對象無法實現(xiàn)對象的重復(fù)利用,并且沒有一種固定的約數(shù),操作起來可能會出現(xiàn)這樣或者那樣的意想不到的問題。
有這樣一個例子:
var a = new Object; var b = new Object; var c = new Object; c[a]=a; c[b]=b; alert(c[a]===a); //輸出什么
關(guān)于這個例子的具體解答詳見 例子出處
工廠方法創(chuàng)建直接看一個例子:
function createPerson(){ var o = new Object(); o.name = "abc"; o.age = 20; return o; }
這種創(chuàng)建對象的方法是在一個function中new Object(),并且賦予屬性和方法,最后return 帶有這些屬性和方法的對象。
但是當(dāng)我們想通過
var p1 = createPerson(); alert(typeof(p1));//Object 僅能得到這個結(jié)果,實際上沒有太大意義 alert(p1 instanceof(類名???))//會發(fā)現(xiàn)其實并不存在一個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)建的對象:
函數(shù)名即為類名
通過this來定義屬性
通過new Person()創(chuàng)建對象
并且有如下屬性:
alert(typeof(p1));// Person alert(p1 instanceof(Person));// true
但是同時我們也發(fā)現(xiàn)這種方式創(chuàng)建對象的一個弊端。對于類中的say方法,每分配一個對象就會有一個say的內(nèi)存空間被分配出來。有一個say的拷貝。如果方法特別多的時候,會造成內(nèi)存空間的極大浪費??梢酝ㄟ^兩種方式進行優(yōu)化和改進:
將say聲明為全局的
function say(){ }
然后在類的定義中通過:
this.say = say;
采用下面提到的基于原型的方式創(chuàng)建對象
讓類中的行為統(tǒng)一指向全局的say方法。但是如果將所有的方法設(shè)為全局的時候,就可以被window對象調(diào)用,那么就破壞了對象的封裝性;如果方法很多,會造成代碼中充斥著大量的全局函數(shù)。
基于原型創(chuàng)建對象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中的一個特殊對象。當(dāng)一個函數(shù)創(chuàng)建之后,會隨之產(chǎn)生一個原型對象。該函數(shù)中的prototype屬性指向該源性對象;
當(dāng)通過該函數(shù)的構(gòu)造函數(shù)創(chuàng)建一個具體對象時,在這個對象中,就會有一個_prop_屬性指向原型。這些是js中的很重要的一種繼承方式--基于原型的繼承的基礎(chǔ)。這里不再贅述。
基于原型創(chuàng)建對象時,如果對象的屬性和方法特別多時,可以通過如下方式進行定義:
Person.prototype = { name:"abc", age:20, say:function(){ } }
稱為原型重寫。原型重寫之后當(dāng)我們再通過 var p1 = new Person()創(chuàng)建一個對象時,p1 的constructor != Person()了。由于原型重寫了,而且沒有通過prototype指向,從而指向了Object()。
如果constructor比較重要,可以再json格式的定義中手動制定
constructor:Pserson
關(guān)于原型重寫,我畫了個示意圖,比較容易理解:
p1是原型重寫前聲明的對象,p2是原型重寫
Person.prototype.name = "123";
之后的聲明的對象。
可以看出
constructor的指向確實沒有自動變換,除非通過上述手動的方式進行修改。
通過p2.name = "456",設(shè)置name時,會在自己的存儲空間中存儲。當(dāng)然查找name屬性時,也是從自己的內(nèi)存空間中讀取name值。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/85977.html
摘要:模式,單實例多進程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進程業(yè)務(wù)代碼。就是我們需要一個調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
摘要:模式,單實例多進程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進程業(yè)務(wù)代碼。就是我們需要一個調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
摘要:模式,單實例多進程,常用于多語言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進程業(yè)務(wù)代碼。就是我們需要一個調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
摘要:采用了新舊的對比,獲取差異的,最后一次性的更新到真實上。對基本屬性進行監(jiān)聽對對象進行監(jiān)聽對對象某一個屬性監(jiān)聽監(jiān)聽自定義指令全局指令,第一個參數(shù)是指令名,第二個參數(shù)是一個對象,對象內(nèi)部有個的函數(shù),函數(shù)里有這個參數(shù),表示綁定了這個指令的元素。 11.vue 虛擬DOM的理解 Web界面由DOM樹(樹的意思是數(shù)據(jù)結(jié)構(gòu))來構(gòu)建,當(dāng)其中一部分發(fā)生變化時,其實就是對應(yīng)某個DOM節(jié)點發(fā)生了變化,??...
閱讀 3079·2023-04-26 02:04
閱讀 1340·2021-11-04 16:07
閱讀 3809·2021-09-22 15:09
閱讀 738·2019-08-30 15:54
閱讀 1962·2019-08-29 14:11
閱讀 2595·2019-08-26 12:19
閱讀 2331·2019-08-26 12:00
閱讀 835·2019-08-26 10:27