国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

細說 Javascript 對象篇(二) : 原型對象

lansheng228 / 1395人閱讀

摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。

Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。
盡管人們經常將此看做是 Javascript 的一個缺點,然而事實上,原型式繼承比傳統的類繼承模型要更加強大。舉個例子,在原型式繼承頂端構建一個類模型很簡單,然而反過來則是個困難得多的任務。
Javascript 是唯一一個被廣泛運用的原型式繼承的語言,所以理解兩種繼承方式的差異是需要時間的。

第一個主要差異就是 Javascript 使用原型鏈來繼承:

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

設置 BarprototypeFoo 的對象實例:

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

確保 Bar 的構造函數為本身,并新建一個 Bar 對象實例:

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

下面我們來看下整個原型鏈的組成:

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

在上面的例子中,對象 test 將會同時繼承 Bar.prototypeFoo.prototype。因此它可以訪問定義在 Foo 中的函數 method。當然,它也可以訪問屬性 value。需要提到的是,當 new Bar() 時并不會創建一個新的 Foo 實例,而是重用它原型對象自帶的 Foo 實例。同樣,所有的 Bar 實例都共享同一個 value 屬性。我們舉例說明:

 test1 = new Bar();
 test2 = new Bar();
 Bar.prototype.value = 41;
 test1.value //41
 test2.value//41
原型鏈查找機制

當訪問一個對象的屬性時,Javascript 會從對象本身開始往上遍歷整個原型鏈,直到找到對應屬性為止。如果此時到達了原型鏈的頂部,也就是上例中的 Object.prototype,仍然未發現需要查找的屬性,那么 Javascript 就會返回 undefined 值。

原型對象的屬性

盡管原型對象的屬性被 Javascript 用來構建原型鏈,我們仍然可以值賦給它。但是原始值復制給 prototype 是無效的,如:

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

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

  

1.原始值(primitive value):
原始值是固定而簡單的值,是存放在棧 stack 中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。
原始類型有以下五種型: Undefined, Null, Boolean, Number, String

  

2.引用值(reference value):
引用值則是比較大的對象,存放在堆 heap 中的對象,也就是說,存儲在變量處的值是一個指針 pointer,指向存儲對象的內存處。所有引用類型都集成自 Object

原型鏈性能問題

如果需要查找的屬性位于原型鏈的上端,那么查找過程對于性能而言無疑會帶來負面影響。當在性能要求必要嚴格的場景中這將是需要重點考慮得因素。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。
同樣,當遍歷一個對象的屬性時,所有在原型鏈上的屬性都將被訪問。

總結

理解原型式繼承是寫較為復雜的 Javascript 代碼的前提,同時要注意代碼中原型鏈的高度。當面臨性能瓶頸時要學會將原型鏈拆分開來。此外,要將原型對象 prototype 和原型 __proto__ 區分開來,這里主要討論原型對象 prototype 就不闡述關于原型 __proto__ 的問題了,如果有疑惑的話,可以閱讀 @nightire 凡哥的博文《理解 JavaScript(四)》。

參考

http://bonsaiden.github.io/JavaScript-Garden/#object.prototype

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78054.html

相關文章

  • 細說 Javascript 函數) : this 的工作機制

    摘要:與其他編程語言相比,對的使用是一套完全不同的機制。在五種情況下的值是各有不同的。調用一個函數時在這里,同樣指向全局對象。此時在函數內,指向新建的對象。盡管,晚綁定初看上去是個不好的決定,但實際上這是原型式繼承工作的基礎。 與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當在全...

    ZoomQuiet 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評論0 收藏0
  • 細說 Javascript 函數(五) : ?構造函數

    Javascript 中的構造函數與其他語言相比也是不同的。任何通過關鍵字 new 調用的函數都可以當做構造函數。 在構造函數體內,this 指向新創建的對象。如果構造函數體內沒有顯示的 return 表達式,那么我們就默認返回 this,也就是新建的對象。 function Foo() { this.bla = 1; } Foo.prototype.test = function()...

    sPeng 評論0 收藏0

發表評論

0條評論

lansheng228

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<