最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

慎用 somefunction.prototype 分析

 更新時(shí)間:2009年06月02日 16:35:59   作者:  
在寫(xiě) JavaScript 腳本的時(shí)候,為了創(chuàng)建一個(gè)類(lèi),如果不使用框架,一般情況我們都會(huì)使用 prototype 來(lái)給要?jiǎng)?chuàng)建的類(lèi)增加公有方法
復(fù)制代碼 代碼如下:

// code from jb51.net
function Person(name) {
this.Name = name;
}
Person.prototype.SayHello = function() {
alert('Hello, ' + this.Name);
}
Person.prototype.SayBye = function() {
alert('Goodbye, ' + this.Name);
}

不過(guò),有的時(shí)候,為了書(shū)寫(xiě)以及維護(hù)的方便,我們會(huì)把公有方法的聲明寫(xiě)到一個(gè)對(duì)象里,然后賦值給 Person.prototype,例如:
復(fù)制代碼 代碼如下:

// code from jb51.net
function Person(name) {
this.Name = name;
}
Person.prototype = {
SayHello: function() {
alert('Hello, ' + this.Name);
},
SayBye: function() {
alert('Goodbye, ' + this.Name);
}
}

使用這種方式,在這個(gè)類(lèi)具有大量公有方法的時(shí)候,就不需要維護(hù)許多的 Person 標(biāo)識(shí)符,如果某一天這個(gè)類(lèi)的名字需要改變,那么要改的地方只有兩個(gè),一個(gè)是 function 的聲明,一個(gè)是 prototype 前面的標(biāo)識(shí)符,如果是使用前一種方式的話,那么有多少個(gè)公有方法,就需要維護(hù) N+1 個(gè)標(biāo)識(shí)符了,雖然可以使用查找替換,但是從穩(wěn)定上來(lái)說(shuō),查找替換可能會(huì)引起一些錯(cuò)誤,這增加了維護(hù)的成本。

這種方式雖然給我們的維護(hù)增加了便利,但也引發(fā)了另外一個(gè)隱藏的問(wèn)題,就是類(lèi)的 constructor 屬性丟失的問(wèn)題。
復(fù)制代碼 代碼如下:

// code from jb51.net
function Person1(name) {
this.Name = name;
}
Person1.prototype.SayHello = function() {
alert('Hello, ' + this.Name);
}
Person1.prototype.SayBye = function() {
alert('Goodbye, ' + this.Name);
}
// code from jb51.net
function Person2(name) {
this.Name = name;
}
Person2.prototype = {
SayHello: function() {
alert('Hello, ' + this.Name);
},
SayBye: function() {
alert('Goodbye, ' + this.Name);
}
}
alert(new Person1('Bill').constructor);
alert(new Person2('Steve').constructor);

運(yùn)行上面的測(cè)試代碼我們可以發(fā)現(xiàn),Person1 的 constructor 屬性為 Person1 類(lèi)的構(gòu)造函數(shù),但是 Person2 的 constructor 屬性卻是 Object,那么在需要使用 constructor 屬性來(lái)判斷對(duì)象類(lèi)型的時(shí)候,就會(huì)出現(xiàn)問(wèn)題。
因此,在寫(xiě) JavaScript 類(lèi)的時(shí)候,如果不需要使用 constructor 屬性來(lái)獲取對(duì)象的類(lèi)型,那么個(gè)人比較傾向于使用第二種寫(xiě)法,但是如果需要使用 constructor 屬性以實(shí)現(xiàn)自己的反射機(jī)制或 GetType 函數(shù)等等,那么就要使用第一種寫(xiě)法。
當(dāng)然,如果在實(shí)現(xiàn)自己反射機(jī)制或 GetType 函數(shù)時(shí)并不依賴(lài) constructor 屬性,那么兩種寫(xiě)法都是可以的了,例如額外維護(hù)一個(gè)成員變量,用于標(biāo)識(shí)自身的類(lèi)型等。也可以使用一些現(xiàn)成的JS框架,有一些框架已經(jīng)實(shí)現(xiàn)了JS中類(lèi)的實(shí)現(xiàn)等,例如 js.class,這就看個(gè)人需要進(jìn)行取舍了。

相關(guān)文章

最新評(píng)論

连山| 邵东县| 汉阴县| 呼图壁县| 喀喇沁旗| 合山市| 左权县| 明溪县| 正安县| 怀仁县| 磐安县| 松滋市| 思茅市| 滕州市| 苍溪县| 泊头市| 偃师市| 元谋县| 惠东县| 田阳县| 元朗区| 绥芬河市| 札达县| 彭阳县| 延寿县| 徐水县| 娄烦县| 嘉善县| 潼南县| 微山县| 迁西县| 达拉特旗| 达日县| 山东| 图木舒克市| 永宁县| 电白县| 肃宁县| 澄江县| 玛曲县| 昆明市|