中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

簡單理解js的prototype屬性

發布時間:2020-10-07 09:22:25 來源:網絡 閱讀:379 作者:zddnd 欄目:網絡安全

百度js的prototype的文章,先看看,W3School關于prototype的介紹:

  簡單理解js的prototype屬性

 

    你覺得這概念適合定義js的prototype這個東西嗎?你是否也認為prototype是一個object對象的屬性呢?是的話,請認真認真看我這篇文章,因為這篇文章會毀滅你的人生三觀,呵呵,就是有這么嚴重,因為本人就是被這個定義給害慘的。

    不得不說,看了網上的一些介紹prototype的文章,基本上都說prototype是對象的一個屬性,于是,我也堅定的認為prototype是一個對象的屬性,所以,我被了坑好久好久,由此,引發的后果就是,我一次次的誤解別人寫的含有prototype的js代碼,也就是當別人亮出js的prototype這個屬性來寫js代碼時,我看著他們寫的代碼都是 ····一頭霧水·····  ,悲催啊!所以,我恨死prototype這個東西了,因此,在這里,我今天必須把js的prototype屬性道個明明白白。看官,請擦亮你的眼睛,仔細看我下面的實驗。

    當然,我希望諸位看官也能夠靜下心來,把我下面的實驗重新做一遍,好證明我的結論是正確的。

    同時,也為了證明·····我沒有····騙你們·····,呵呵,廢話不多說了,下面進入實驗階段。

    先介紹一個下面要用到的函數,JSON.stringify(value)。

    這個函數的作用是:把傳入的參數value變成字符串,它有三個參數,第一個參數是必須的,其余的兩個參數可填可不填。

    關于JSON.stringify函數的作用請看這篇文章。http://www.cnblogs.com/ningvsban/p/3660654.html,這里說的很清楚。

    首先,測試W3Schol的定義到底行不行的通:

    如果,真如W3Schol所說的那樣,prototype是object的一個屬性,那么,我們來創建一個對象,看看這個對象的prototype到底是啥。

var ob = { };//超級簡單的空對象
alert(JSON.stringify(ob.prototype));

 

    你覺得上面的代碼會alert出什么呢?既然prototype是object的一個屬性,那么上面肯定能夠獲取到什么東西對吧?但是,如果你拿這段代碼去做實驗了,你會被打臉的,因為它alert的東西是·········undefined··········,也就是說object這個屬性prototype不是個東西,很殘酷吧,但現實就是這樣,任何對象引用prototype都會出現undefined,不信,你可以試一試。

    我可以很明白的告訴你,prototype絕對不是給對象用的,對象根本沒辦法引用prototype這個屬性,它真正的屬主,其實是···········函數········,記住,能夠引用prototype的東西絕對是函數,絕對是函數,絕對是函數,prototype是屬于函數的一個屬性,prototype是屬于函數的一個屬性,prototype是屬于函數的一個屬性,能夠引用它的只有·····函數····,能夠引用它的只有·····函數·····,能夠引用它的只有····函數····,函數,函數,函數,重要的事情一定要說千百遍,呵呵,因為只有明確這一點,下面,你才明白我要講的東西。別怪我這么墨跡啊!

    下面,我要給prototype一個名副其實的定義:

    prototype是函數的一個屬性,是函數的原型對象。

    就是這么簡單,能看明白嗎? prototype只能夠被   函數     調用。

    別搞混了js的object對象和function函數,js的對象和函數絕對是兩個概念,為什么?因為js的function函數可以new出object對象啊,是吧?這個你總該知道吧?

    下面,來做試驗證明我的結論。   

//首先定義一個有名函數func
function func(){
    
}
alert(func.prototype);

    你說,上面的代碼會alert什么呢?還會不會是undefined的呢?我敢肯定的告訴你絕對不是undefined的,因為本人已經alert過了,呵呵。

    上面,彈出的窗口是:

簡單理解js的prototype屬性

     沒錯,返回的就是對象,這回你肯相信我,能夠調用prototype的一定是函數了吧?object引用prototype的時候給你返回的是一個不是東西的東西undefined,函數引用prototype的時候給你返回一個真真實實存在的東西object的,這還不夠證明prototype是給函數用的嗎?還不能夠證明對象是不能引用prototype的嗎?呵呵,又多說了。

    上面我已經說過,prototype是函數的一個屬性,也是函數的原型對象,而這里func函數引用prototype的時候返回的是一個對象object的,那么,結合這兩個概念,你能得出什么結論呢?我想通過這不難得出結論:

    prototype是········函數的原型對象············,這能理解嗎?不能理解,沒有關系,我們再來做一個實驗,終于要用到文章開始給你們介紹的一個函數JSON.stringify()了。

function func(){
    
}
alert(JSON.stringify(func.prototype));

    還是引用上面的函數func,只不過這里返回的是JSON.stringify()函數的返回值。

簡單理解js的prototype屬性

   你沒有看錯,這里alert的結果是一個空對象,這證明,prototype的的確確屬于函數的屬性,并且函數的prototype屬性的js數據類型是對象,明白不?為什么現在是一個空對象?你有沒有想過?為什么呢?請思考這個問題三秒鐘,假如想不出來,那么沒有關系,下面,我來解釋。

  先看,實驗代碼:

function func(){
    
}
func.prototype.name ='prototype是函數的的屬性,本質是函數的原型對象';
alert(JSON.stringify(func.prototype))

    你說,上面的代碼會alert出什么呢?請看下面:

簡單理解js的prototype屬性

     你沒有看錯,此刻,終于alert出東西來了,我在這里給prototype賦于一個屬性name,所以,我這個時候在alert函數func的prototype時,你看到有值了嗎?看到了prototype的屬性name值了嗎?現在再想想,為什么上面第一層alert函數func.prototype的時候,它是一個空對象呢?而現在它又是一個有值的對象呢?

    原因很簡單呢,因為第一次的時候,我沒有給函數的屬性func.prototype賦予name屬性,也沒有給name屬性賦值啊,而現在我已經給函數的屬性func.prototype賦予屬性name,并且賦值為········prototype是函數的的屬性,本質是函數的原型對象······,所以,現在alert函數的屬性func.prototype的時候它就有值啦,對吧?

    因此,這里得出結論:

    prototype是函數的的屬性,本質是函數的原型對象。

    別以為js中只有對象才有屬性,通過這里,我們也可以知道,其實js的函數也是有屬性的,而且js的函數好像就只有這個屬性prototype,而且js的這個函數屬性同時還是函數的原型對象,你是不是被搞暈了?希望你沒有被搞暈才好。

    為什么說prototype是函數的一個屬性呢?因為,只有函數才能調用prototype,而且是以這樣的方式func.prototype調用的,這樣的方式調用東西是不是和對象調用屬性一模一樣呢?是的,就是因為函數調用prototype的時候是和對象調用屬性的時候一樣的,我們才把prototype說成是函數的一個屬性,而函數的這個屬性其實是一個對象(這個是不是對象,上面已經證明了,這里就不再說明),所以說,這個prototype就是函數的屬性,本質是函數的原型對象。

    這里為什么強調說prototype的本質是函數的原型對象呢?

    下面看代碼證明,我的代碼很簡單的:

簡單理解js的prototype屬性

簡單理解js的prototype屬性

    //定義一個函數
    function func(){
    
    }
    //給函數的屬性prototype賦予一個方法get
    func.prototype.get=function(value){
        return value;//很簡單,你給我什么我就輸出什么
    }

簡單理解js的prototype屬性

簡單理解js的prototype屬性

    你說,怎么調用上面那個get方法?

    我給你一點提示,get是屬于func函數的一個屬性函數,既然是屬性函數,那么我們怎么調用呢?

    很簡單,屬性函數必須由它的對象來調用,那么我們怎么獲取get的對象呢?很簡單,用關鍵字new來實例化func函數的對象就行了嗎?是吧?

    下面,實例化func函數的一個對象ob1:

var ob1 = new func();
//用func實例化出來的對象來調用get屬性函數
alert(ob1.get('hello,prototype原型對象'));

簡單理解js的prototype屬性

    沒錯,用func函數實例化出來的對象ob1,確實能夠調用get函數,上面已經利用ob1調用get函數alert出來了,這就證明func函數的實例對象是擁有get這個屬性函數的,對吧?這么明顯,就不用說明了吧。

    如果,你不信必須要用實例化func的對象來調用get函數,你可以試試直接用func調用get函數,也就是說,你可以嘗試著func.get()調用一下get函數看看,看func它到底能不能夠直接調用get函數。我想一定報錯,呵呵,原因是什么,你自己想。

    那么,說了這么多,我還是沒有說明,為什么我說prototype的本質是函數的原型對象啊?對吧?

    請看,下面的代碼:

 

var ob2 = new func();
//用func實例化出來的對象來調用get屬性方法
alert(ob2.get('我依然是func實例化出來的對象'));

 簡單理解js的prototype屬性

 

     看到沒有,我還是再次利用func函數實例化一個ob2,這個對象依然能夠調用get屬性函數,這說明什么了呢?這說明了,利用func對象實例化的所有對象都可以調用get這個屬性函數。既然如此,你說,prototype這個屬性如果不是函數func的原型對象的話,那么為什么給prototype賦予的屬性函數get能夠被func所有實例化的對象所調用呢?假如prototype的本質不是func函數的原型對象,那么依據func函數實例化出來的對象就不可能一個個都能夠調用get這個屬性方法,對吧?為什么?我們來個比例,你說,一個不是源頭的東西,它能影響到所有的東西嗎?不能夠吧?因此,這里得出結論:

    prototype是函數的一個屬性,本質就是函數的原型對象。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辛集市| 花莲县| 米易县| 兴化市| 施甸县| 嘉善县| 扎赉特旗| 江达县| 淄博市| 白城市| 乳源| 宝应县| 邓州市| 米泉市| 汨罗市| 云林县| 克拉玛依市| 昂仁县| 台东县| 邵武市| 平泉县| 文水县| 洱源县| 广河县| 诸城市| 徐闻县| 东港市| 明水县| 安塞县| 环江| 彭泽县| 策勒县| 南宁市| 东至县| 保定市| 确山县| 蓝田县| 开封市| 徐水县| 万宁市| 高清|