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