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

資訊專欄INFORMATION COLUMN

原型與原型鏈

denson / 394人閱讀

摘要:全局對象規定全局對象叫做,但是瀏覽器把作為全局對象瀏覽器先存在的。就是一個哈希表,里面含有很多屬性。對象表示一個包含文檔的窗口,其屬性指向窗口中載入的文檔。使用屬性可以獲取指定文檔所在窗口。在標簽瀏覽器比如中,每個標簽具有自己的對象。

全局對象

ECMAScript規定全局對象叫做global,但是瀏覽器把window作為全局對象(瀏覽器先存在的)。
window就是一個哈希表,里面含有很多屬性。
window 對象表示一個包含DOM文檔的窗口,其 document 屬性指向窗口中載入的 DOM文檔 。使用 document.defaultView 屬性可以獲取指定文檔所在窗口。
在標簽瀏覽器(比如Firefox)中,每個標簽具有自己的 window 對象。也就是說,同一個窗口的標簽之間不會共享一個 window 對象。
無代碼時,創建一個新頁面window就會被創建。
window的屬性就是全局變量。
這些全局變量分為兩種:

1、一種是 ECMAScript 規定的

例如:

parseInt

parseFloat

Number

String

Boolean

Object

2、一種是瀏覽器自己加的屬性

例如:

alert

prompt

comfirm

console.log

console.dir

document

document.createElement

document.getElementById

簡單類型和對象的區別 1、創建一個number
var n = 1
var n = new Number(1)

這兩個都是創建一個Number類型的數據,但是區別在于,第二個創建的是聲明一個對象,因為js創建初期要求和java相像,所以才有了這種數據創建方式,雖然用第一種創建的是一個簡單數據類型,但是卻可以擁有toString,valueOf等函數,這是因為臨時轉換成一個temp臨時對象,而這個對象中包含了那些函數

2、創建一個string
var s = "string"
var s = new String("string")

創建string也有兩種方法,第二種方法和第一種的區別就是,第二種創建的也是一個對象,具體和number是一樣的

3、創建一個boolean
var b = true
var b = new Boolean(ture)

創建布爾類型也有兩種方法,第二種創建的是一個對象,和number和string一樣,但是布爾使用第二種創建方法有個問題就是,因為第二種創建的是一個對象,所以如果直接用來判斷無論是真假都會變成真,就像這樣

var b = new Boolean(false)

b == Boolean?{false}
!!b == true

因為所有對象轉換為布爾值都為真

4、創建一個object
var o = {}
var o = new Object()

對于創建對象來說,兩種創建方法得出的對象完全一樣

公用屬性(原型) 原型

所有對象上都有toString,valueOf這兩個函數,但是如果創建一個對象就創建一次這種共有的函數,那是非常占內存的。
所以就將這些對象共有的函數給取出來重新生成一個對象并存在一個地址,這樣每創建一個對象將共有函數的地址存進去就可以使每個對象調用其公用屬性了,不用浪費去聲明重復意義的函數
在對象中存在一個隱藏屬性__proto__來儲存公用屬性的地址,當要調用toString時,首先看對象屬性里存不存這個函數,如果不存在就會進入公用屬性里面去找,然后調用

//控制臺打印
var o1 = {}
undefined
var o2 = new Object()
undefined
o1 === o2
false
o1.toString === o2.toString
true

由此可以看出,不同對象里的公用函數是一樣的,這個公用屬性就是原型
通過原型這種機制,JavaScript 中的對象從其他對象繼承功能特性;這種繼承機制與經典的面向對象編程語言的繼承機制不同。

原型鏈

不僅只有object有公用屬性,Number、String、Boolean都有各自的共有屬性,如果創建一個number類型,其中toFixed函數并沒有存在于Obj的公用屬性里面,那么它要存在哪里
這就是因為Number也存在自己的公用屬性,當使用Number創建一個對象的時候,對象中存在隱藏屬性__proto__儲存著Number公用屬性的地址,而Number的公用屬性中也存在著一個隱藏屬性__proto__,這個隱藏屬性存著的地址是Object的公用屬性的地址

var n = new Number(1)
var o1 = new Object()
n.__proto__.__proto__ === o1.__proto__
true

不僅是Number類型是這樣,String和Boolean類型中也存在各自的公用屬性,而像上面描述的那樣,Number對象存在隱藏屬性指向Number的公用屬性,Number公用屬性中存在隱藏屬性指向Object的公用屬性,像這樣像一條鏈子一樣將它們的公用屬性串連起來的東西就叫做原型鏈

__proto__和prototype

我們都知道瀏覽器有垃圾回收機制,但是當我打開一個頁面什么都沒有創建時,公用屬性作為一個哈希表,如果沒有被引用,那么它就將會被回收,而是什么引用的它們呢

Object.prototype

這個就是object的公用屬性,也就是原型

var o1 = {}
o1.__proto__ === Object.prototype
true

Number對象也是一樣的

var n1 = new Number(1)
n1.__proto__ === Number.prototype
true

由此我們可以推出n1的公用屬性的公用屬性就是

n1.__proto__.__proto__ === Object.prototype
true

String和Boolean也是和Number一樣

var s1 = new String("1")
var b1 = new Boolean(true)

b1.__proto__ === Boolean.prototype
true
s1.__proto__ === String.prototype
true
b1.__proto__.__proto__ === Object.prototype
true
s1.__proto__.__proto__ === Object.prototype
true

聲明一個變量,就是一、將哈希整理好,二、__proto__指向公用屬性
prototype和__proto__都是對公用屬性的引用,區別在于,prototype是防止公用屬性被垃圾回收清理,而__proto__是對公用屬性的使用
總結來說就是

var 對象 = new 函數()
對象.__proto__ === 函數.prototype//因為 Function 是 Object 的構造函數。

__proto__是對象的屬性,prototype是函數的屬性
雖然String.prototype的隱藏屬性指向

String.prototype.__proto__ === Object.prototype
true

但是Object.prototype的隱藏屬性指向null

Object.prototype.__proto__ === null
true

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

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

相關文章

  • 《javascript高級程序設計》筆記:原型圖解

    摘要:不理解沒關系,下面會結合圖例分析上一篇高級程序設計筆記創建對象下一篇高級程序設計筆記繼承參考之原型鏈的解讀三張圖搞懂的原型對象與原型鏈繼承與原型鏈 文章直接從原型圖解開始的,如果對一些概念不太清除,可以結合后面幾節查看 1. 圖解原型鏈 1.1 鐵三角關系(重點) function Person() {}; var p = new Person(); showImg(https://s...

    vspiders 評論0 收藏0
  • 【5】JavaScript 函數高級——原型原型深入理解(圖解)

    摘要:探索是如何判斷的表達式如果函數的顯式原型對象在對象的隱式原型鏈上,返回,否則返回是通過自己產生的實例案例案例重要注意的顯示原型和隱式原型是一樣的。面試題測試題測試題報錯對照下圖理解 原型與原型鏈深入理解(圖解) 原型(prototype) 函數的 prototype 屬性(圖) 每個函數都有一個prototype屬性,它默認指向一個Object空對象(即稱為:原型對象) 原型對象中有...

    馬龍駒 評論0 收藏0
  • JavaScript中的原型原型

    摘要:前言作為前端高頻面試題之一,相信很多小伙伴都有遇到過這個問題。 前言 作為前端高頻面試題之一,相信很多小伙伴都有遇到過這個問題。那么你是否清楚完整的了解它呢? 國際慣例,讓我們先拋出問題: 什么是原型、原型鏈 它們有什么特點 它們能做什么 怎么確定它們的關系 或許你已經有答案,或許你開始有點疑惑,無論是 get 新技能或是簡單的溫習一次,讓我們一起去探究一番吧 如果文章中有出現紕...

    laoLiueizo 評論0 收藏0
  • 進擊JavaScript之(四)原型原型

    摘要:每一個由構造函數創建的對象都會默認的連接到該神秘對象上。在構造方法中也具有類似的功能,因此也稱其為類實例與對象實例一般是指某一個構造函數創建出來的對象,我們稱為構造函數的實例實例就是對象。表示該原型是與什么構造函數聯系起來的。 本文您將看到以下內容: 傳統構造函數的問題 一些相關概念 認識原型 構造、原型、實例三角結構圖 對象的原型鏈 函數的構造函數Function 一句話說明什么...

    XBaron 評論0 收藏0
  • 原型一:原型原型

    摘要:說白了,原型就是構造函數用來構造新實例的模板對象。什么是原型鏈先回答什么是原型。例如這個原型的原型就是這個構造函數的,既這個原型對象。這些原型對象通過像鏈子一樣連起來,就叫做原型鏈。 原型鏈初步學習 這篇博客只是我初步理解原型鏈的一個個人學習筆記,寫的比較粗略,且有的地方可能理解錯誤. 更多更專業的關于原型鏈的解釋請看JavaScript深入之從原型到原型鏈和阮一峰的博客:Javas...

    MudOnTire 評論0 收藏0
  • JavaScript系列--淺析原型繼承

    摘要:綜上所述有原型鏈繼承,構造函數繼承經典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優點于一身是實現基于類型繼承的最有效方法。 一、前言 繼承是面向對象(OOP)語言中的一個最為人津津樂道的概念。許多面對對象(OOP)語言都支持兩種繼承方式::接口繼承 和 實現繼承 。 接口繼承只繼承方法簽名,而實現繼承則繼承實際的方法。由于js中方法沒有簽名...

    draveness 評論0 收藏0

發表評論

0條評論

denson

|高級講師

TA的文章

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