摘要:中創(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
摘要:模式,單實(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...
摘要:模式,單實(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...
摘要:模式,單實(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...
摘要:采用了新舊的對(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ā)生了變化,??...
閱讀 2964·2023-04-26 02:04
閱讀 1277·2021-11-04 16:07
閱讀 3698·2021-09-22 15:09
閱讀 678·2019-08-30 15:54
閱讀 1898·2019-08-29 14:11
閱讀 2524·2019-08-26 12:19
閱讀 2254·2019-08-26 12:00
閱讀 751·2019-08-26 10:27