摘要:除此之外,原型是共享的,如果我們有的寫(xiě)法,改變這兩個(gè)對(duì)象任何一個(gè)的原型都會(huì)影響另外一個(gè),這在大多的情況下是不可取的。當(dāng)對(duì)象查找一個(gè)屬性的時(shí)候,他會(huì)沿著原型鏈一直往上追蹤,直到直到為之。在性能方面,原則上應(yīng)該盡量避免原型鏈太長(zhǎng)。
簡(jiǎn)介
如果之間學(xué)習(xí)過(guò)cpp 、java 之類(lèi)的語(yǔ)言,都會(huì)知道他們是可以基于類(lèi) class 進(jìn)行繼承的, 在JavaScript 中,并沒(méi)有類(lèi)繼承這個(gè)概念,要實(shí)現(xiàn)JavaScript 中的繼承,需要原型來(lái)幫助。
比如在下面的這段代碼中:
function Foo () { this.value = 1; }; Foo.prototype = { method: function () {}; }; //設(shè)置Bar的原型為Foo()的實(shí)例 Bar.prototype = new Foo(); Bar.prototype.foo = "Hello World"; //修正Bar的constructor Bar.prototype.constructor = Bar; //創(chuàng)建一個(gè)Bar的實(shí)例 var test = new Bar();
在這段代碼中,就一直維護(hù)著一個(gè)原型鏈,抽象化的理解起來(lái)可能是這樣的:
test [Bar的實(shí)例] Bar.prototype [Foo的實(shí)例] {foo: "Hello World!"} Foo.prototype {method: function(){}} Object.prototype {...}
很好去理解,test 是從Bar.prototype 和 Foo.prototype 中繼承下來(lái)的,所以他能夠訪(fǎng)問(wèn)Foo 實(shí)例屬性中的value 。
需要注意的是,在 new Bar 操作中,并不會(huì)重新創(chuàng)建一個(gè)Foo 的實(shí)例,而是會(huì)重復(fù)的使用在他的原型上的那個(gè)實(shí)例。
除此之外,原型是共享的,如果我們有Foo.prototype = Bar.prototype 的寫(xiě)法,改變這兩個(gè)對(duì)象任何一個(gè)的原型都會(huì)影響另外一個(gè),這在大多的情況下是不可取的。
當(dāng)對(duì)象查找一個(gè)屬性的時(shí)候,他會(huì)沿著原型鏈一直往上追蹤,直到直到為之。當(dāng)然 Object.prototypr 就是這個(gè)鏈的最后一層了,如果還是沒(méi)找到,就會(huì)返回undefined 。
hasOwnProperty在性能方面,原則上應(yīng)該盡量避免原型鏈太長(zhǎng)。正如用for ... in ... 去遍歷的時(shí)候,他會(huì)去遍歷整個(gè)原型鏈,這往往在比較高的性能要求或者普通的遍歷中是不可取的。
為了去判斷一個(gè)對(duì)象包含的屬性是他本身就有的還是在原型鏈上的,需要使用繼承在Object prototype 上的hasOwnProperty 方法。
比如在下面的例子中
Oboject.prototype.bar = 1; var foo = { value: 2; }; foo.var //通過(guò)原型鏈繼承自O(shè)bject,輸出1 "bar" in foo; //通過(guò)整個(gè)原型鏈進(jìn)行查找,輸出true foo.hasOwnProperty("bar"); //false foo.hasOwnProperty("value") //true
在for ... in ... 的遍歷中,一般建議使用hasOwnProperty 的方法。
需要注意的是: javascript并沒(méi)有對(duì)hasOwnProperty 做相關(guān)的保護(hù),如果恰巧對(duì)象有這個(gè)叫做hasOwnProperty 的屬性,那么產(chǎn)生的結(jié)果應(yīng)該不是我們所期待的。比如像下面這樣:
var foo = { hasOwnProperty: function () { return flase}; bar: "1"; }; foo.hasOwnProperty("bar") //正如你猜的那樣,返回的值永遠(yuǎn)是false
這時(shí)候可能需要做的就是調(diào)用外部的hasOwnproperty, 對(duì),就是用call 或者apply。像下面這樣:
//返回true Object.hasOwnProperty.call(foo, "bar"); Object.hasOwnProperty.apply(foo, ["bar"]);
原文鏈接:http://life.rccoder.net/javascript/1207.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78374.html
摘要:面向過(guò)程函數(shù)式編程面向?qū)ο缶幊痰诙€(gè)并不是大家理解的那樣,我們先說(shuō)舉個(gè)現(xiàn)實(shí)例子就明白了。多說(shuō)一句函數(shù)是編程是非常強(qiáng)大也是我最喜歡的,以后再說(shuō),我們先說(shuō)面向?qū)ο缶幊獭? 概述 當(dāng)大家已經(jīng)把js的語(yǔ)言基礎(chǔ)理解了,然后能夠?qū)懗鲆恍┖?jiǎn)單的例子了,這個(gè)時(shí)候基本上達(dá)到了一年工作經(jīng)驗(yàn)的水平,而自己能夠獨(dú)立的寫(xiě)一些小功能,完成一些小效果,或者臨摹修改一些比較復(fù)雜的插件的時(shí)候差不多就是兩年工作經(jīng)驗(yàn)的水平,...
摘要:簡(jiǎn)而言之,公司需要采取主動(dòng)系統(tǒng)的方法,使網(wǎng)絡(luò)安全功能可以適應(yīng)公共云。將開(kāi)發(fā)運(yùn)維應(yīng)用于網(wǎng)絡(luò)安全如果開(kāi)發(fā)人員可以在短短幾秒內(nèi)啟動(dòng)服務(wù)器,但必須等待兩周的時(shí)間才能讓安全團(tuán)隊(duì)認(rèn)同配置,這會(huì)削弱公共的云靈活性所帶來(lái)的價(jià)值。隨著企業(yè)不斷擴(kuò)大對(duì)公共云的使用,它們必須反思如何保護(hù)數(shù)據(jù)和應(yīng)用程序,并實(shí)施四項(xiàng)關(guān)鍵實(shí)踐。經(jīng)過(guò)長(zhǎng)時(shí)間的實(shí)驗(yàn),龍頭企業(yè)正在認(rèn)真考慮大規(guī)模采用公共云。在過(guò)去幾年中,很多公司已經(jīng)改變了IT戰(zhàn)...
摘要:深入系列的第一篇,從原型與原型鏈開(kāi)始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。讓我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系在這張圖中我們用表示實(shí)例原型。 JavaScript深入系列的第一篇,從原型與原型鏈開(kāi)始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。 構(gòu)造函數(shù)創(chuàng)建對(duì)象 我們先...
摘要:每一個(gè)由構(gòu)造函數(shù)創(chuàng)建的對(duì)象都會(huì)默認(rèn)的連接到該神秘對(duì)象上。在構(gòu)造方法中也具有類(lèi)似的功能,因此也稱(chēng)其為類(lèi)實(shí)例與對(duì)象實(shí)例一般是指某一個(gè)構(gòu)造函數(shù)創(chuàng)建出來(lái)的對(duì)象,我們稱(chēng)為構(gòu)造函數(shù)的實(shí)例實(shí)例就是對(duì)象。表示該原型是與什么構(gòu)造函數(shù)聯(lián)系起來(lái)的。 本文您將看到以下內(nèi)容: 傳統(tǒng)構(gòu)造函數(shù)的問(wèn)題 一些相關(guān)概念 認(rèn)識(shí)原型 構(gòu)造、原型、實(shí)例三角結(jié)構(gòu)圖 對(duì)象的原型鏈 函數(shù)的構(gòu)造函數(shù)Function 一句話(huà)說(shuō)明什么...
閱讀 2309·2021-10-13 09:39
閱讀 3427·2021-09-30 09:52
閱讀 811·2021-09-26 09:55
閱讀 2784·2019-08-30 13:19
閱讀 1902·2019-08-26 10:42
閱讀 3198·2019-08-26 10:17
閱讀 552·2019-08-23 14:52
閱讀 3648·2019-08-23 14:39