欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript 學(xué)習(xí)筆記之 對(duì)象篇(二) : 原型對(duì)象

 更新時(shí)間:2014年06月24日 08:57:13   投稿:hebedich  
Javascript 并沒(méi)有類(lèi)繼承模型,而是使用原型對(duì)象 prototype 進(jìn)行原型式繼承。盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然而事實(shí)上,原型式繼承比傳統(tǒng)的類(lèi)繼承模型要更加強(qiáng)大。舉個(gè)例子,在原型式繼承頂端構(gòu)建一個(gè)類(lèi)模型很簡(jiǎn)單,然而反過(guò)來(lái)則是個(gè)困難得多的任務(wù)。

Javascript 是唯一一個(gè)被廣泛運(yùn)用的原型式繼承的語(yǔ)言,所以理解兩種繼承方式的差異是需要時(shí)間的。

第一個(gè)主要差異就是 Javascript 使用原型鏈來(lái)繼承:

function Foo() {
 this.value = 42;
}
Foo.prototype = {
 method: function() {}
};
function Bar() {}

設(shè)置 Bar 的 prototype 為 Foo 的對(duì)象實(shí)例:

Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

確保 Bar 的構(gòu)造函數(shù)為本身,并新建一個(gè) Bar 對(duì)象實(shí)例:

Bar.prototype.constructor = Bar;
var test = new Bar();

下面我們來(lái)看下整個(gè)原型鏈的組成:

test [instance of Bar]
 Bar.prototype [instance of Foo]
 { foo: 'Hello World' }
 Foo.prototype
  { method: ... }
  Object.prototype
  { toString: ... /* etc. */ }

在上面的例子中,對(duì)象 test 將會(huì)同時(shí)繼承 Bar.prototype 和 Foo.prototype。因此它可以訪問(wèn)定義在 Foo 中的函數(shù) method。當(dāng)然,它也可以訪問(wèn)屬性 value。需要提到的是,當(dāng) new Bar() 時(shí)并不會(huì)創(chuàng)建一個(gè)新的 Foo 實(shí)例,而是重用它原型對(duì)象自帶的 Foo 實(shí)例。同樣,所有的 Bar 實(shí)例都共享同一個(gè) value 屬性。我們舉例說(shuō)明:

test1 = new Bar();
 test2 = new Bar();
 Bar.prototype.value = 41;
 test1.value //41
 test2.value//41

原型鏈查找機(jī)制

當(dāng)訪問(wèn)一個(gè)對(duì)象的屬性時(shí),Javascript 會(huì)從對(duì)象本身開(kāi)始往上遍歷整個(gè)原型鏈,直到找到對(duì)應(yīng)屬性為止。如果此時(shí)到達(dá)了原型鏈的頂部,也就是上例中的 Object.prototype,仍然未發(fā)現(xiàn)需要查找的屬性,那么 Javascript 就會(huì)返回 undefined 值。

原型對(duì)象的屬性

盡管原型對(duì)象的屬性被 Javascript 用來(lái)構(gòu)建原型鏈,我們?nèi)匀豢梢灾蒂x給它。但是原始值復(fù)制給 prototype 是無(wú)效的,如:

function Foo() {}
Foo.prototype = 1; // no effect

這里講個(gè)本篇的題外話(huà),介紹下什么是原始值:
在 Javascript 中,變量可以存放兩種類(lèi)型的值,分別是原始值和引用值。

1.原始值(primitive value):

原始值是固定而簡(jiǎn)單的值,是存放在棧 stack 中的簡(jiǎn)單數(shù)據(jù)段,也就是說(shuō),它們的值直接存儲(chǔ)在變量訪問(wèn)的位置。
原始類(lèi)型有以下五種型: Undefined, Null, Boolean, Number, String。

2.引用值(reference value):

引用值則是比較大的對(duì)象,存放在堆 heap 中的對(duì)象,也就是說(shuō),存儲(chǔ)在變量處的值是一個(gè)指針  pointer,指向存儲(chǔ)對(duì)象的內(nèi)存處。所有引用類(lèi)型都集成自 Object。
原型鏈性能問(wèn)題

如果需要查找的屬性位于原型鏈的上端,那么查找過(guò)程對(duì)于性能而言無(wú)疑會(huì)帶來(lái)負(fù)面影響。當(dāng)在性能要求必要嚴(yán)格的場(chǎng)景中這將是需要重點(diǎn)考慮得因素。此外,試圖查找一個(gè)不存在屬性時(shí)將會(huì)遍歷整個(gè)原型鏈。
同樣,當(dāng)遍歷一個(gè)對(duì)象的屬性時(shí),所有在原型鏈上的屬性都將被訪問(wèn)。

總結(jié)

理解原型式繼承是寫(xiě)較為復(fù)雜的 Javascript 代碼的前提,同時(shí)要注意代碼中原型鏈的高度。當(dāng)面臨性能瓶頸時(shí)要學(xué)會(huì)將原型鏈拆分開(kāi)來(lái)。此外,要將原型對(duì)象 prototype 和原型 __proto__ 區(qū)分開(kāi)來(lái),這里主要討論原型對(duì)象 prototype 就不闡述關(guān)于原型 __proto__ 的問(wèn)題了,

相關(guān)文章

  • 全面理解JavaScript中的閉包

    全面理解JavaScript中的閉包

    將外部作用域中的局部變量封閉起來(lái)的函數(shù)對(duì)象稱(chēng)為閉包(Closure),被封閉起來(lái)的變量與封閉它的函數(shù)對(duì)象有相同的生命周期,這在JavaScript中比較難理解而且十分重要,接下來(lái)帶大家一起來(lái)全面理解JavaScript中的閉包:
    2016-05-05
  • ParseInt函數(shù)參數(shù)設(shè)置介紹

    ParseInt函數(shù)參數(shù)設(shè)置介紹

    經(jīng)常用ParseInt函數(shù)轉(zhuǎn)換字符串為int數(shù)值,ParseInt函數(shù)有兩個(gè)參數(shù)可以設(shè)置,其中第二個(gè)參數(shù)可以缺省
    2014-01-01
  • 辨析JavaScript中的Undefined類(lèi)型與null類(lèi)型

    辨析JavaScript中的Undefined類(lèi)型與null類(lèi)型

    Undefined與null都是js中的基本數(shù)據(jù)類(lèi)型,然而正如它們的名字那樣,未初始化和空并不相同,下面我們就來(lái)詳細(xì)辨析JavaScript中的Undefined類(lèi)型與null類(lèi)型:
    2016-05-05
  • 貼一個(gè)在Mozilla中常用的Javascript代碼

    貼一個(gè)在Mozilla中常用的Javascript代碼

    貼一個(gè)在Mozilla中常用的Javascript代碼...
    2007-01-01
  • 了解ESlint和其相關(guān)操作小結(jié)

    了解ESlint和其相關(guān)操作小結(jié)

    這篇文章主要介紹了了解ESlint和其相關(guān)操作小結(jié),詳細(xì)的介紹了什么是ESlint以及ESlint規(guī)范,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Javascript中Date類(lèi)型和Math類(lèi)型詳解

    Javascript中Date類(lèi)型和Math類(lèi)型詳解

    這篇文章主要給大家介紹了Javascript中Date類(lèi)型和Math類(lèi)型的一些基礎(chǔ)知識(shí),非常的實(shí)用,有需要的小伙伴可以參考下
    2016-02-02
  • 最實(shí)用的JS數(shù)組函數(shù)整理

    最實(shí)用的JS數(shù)組函數(shù)整理

    本篇文章小編給大家整理了非常全的JS數(shù)組函數(shù)以及相關(guān)的寫(xiě)法規(guī)則,希望能夠?qū)ψx者們起到幫助和參考。
    2017-12-12
  • js轉(zhuǎn)義字符介紹

    js轉(zhuǎn)義字符介紹

    有時(shí)候js得到j(luò)son串中含有"<"和">" ,那么兩個(gè)尖括號(hào)中間的文字是無(wú)法在html頁(yè)面顯示出來(lái)的,必須用轉(zhuǎn)義字符
    2013-11-11
  • javascript列表框操作函數(shù)集合匯總

    javascript列表框操作函數(shù)集合匯總

    這篇文章主要是對(duì)javascript列表框操作函數(shù)進(jìn)行了詳細(xì)的匯總介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • 詳解JavaScript中數(shù)組和字符串的lastIndexOf()方法使用

    詳解JavaScript中數(shù)組和字符串的lastIndexOf()方法使用

    這篇文章主要介紹了詳解JavaScript中數(shù)組和字符串的lastIndexOf()方法使用,文中特別提及了IE8的兼容問(wèn)題以及for in的使用問(wèn)題,需要的朋友可以參考下
    2016-03-03

最新評(píng)論