最近在論壇看到一篇文章關於prototype斷鏈的,原文如下
var sound = {echo: function() { alert("sound"); } };function Person() {this.name="name_";};Person.prototype = sound;//----早點綁上去----var fo1o = new Person(); var xxxxxx=Person.prototype;//----遲了綁上去----??xxxxxx.yyyy="yyyy_"; alert(fo1o.echo);//alert(undefined);alert(fo1o.yyyy);//alert(undefined);////////////////////////////////////////////////////////////////////////////////////////////////////var sound = {echo: function() { alert("sound"); } };function Person() {this.name="name_";};var fo1o = new Person(); Person.prototype = sound;//----遲了綁上去----var xxxxxx=Person.prototype;//----遲了綁上去----??xxxxxx.yyyy="yyyy_"; alert(fo1o.echo);//alert(function(){....});alert(fo1o.yyyy);//alert("yyyy_");//為什麼alert(fo1o.yyyy)會受到影響。
這裡的alert注釋寫反了,不過這不是重點,重點是為什麼第二次alert的東西是undefined?而且後來我做了實驗,測試如下內容:
1.alert(fo1o.name);//name_
2.Person.prototype.name='_name';alert(fo1o.name);//name_
3.Person.prototype.name='_name';var fo2o=new Person();alert(fo2o.name);//name_
以上三個實驗主要是測試prototype能否修改對象原有屬性,結果是不能的,因為其實每個對象儲存的東西除了固有(即聲明時帶著)的屬性和方法外,還有一個prototype對象,而prototype主要是用來擴充原有對象的功能,就是說,如果訪問一個對象的屬性時,先在固有屬性裡找,如果找不到,就再去prototype對象中的屬性中找。具體請看下面兩個圖:
第一個圖聲明了一個類Person,該類有一個固有屬性name和一個prototype屬性age,然後聲明一個Person的對象a,然後它的name屬性從Person類中cZ喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcHnBy9K7t92jrLWrysdwcm90b3R5cGXWuM/ytcTE2rTmu7nKx9K70fmjrNXiwO+/ydLUsNFwcm90b3R5cGW/tNf20ru49ta41euho8v50tTL+dPQUGVyc29uttTP87a8v8nS1Lmyz+1wcm90b3R5cGW1xMr00NS6zbe9t6ijqNa70qpQZXJzb261xHByb3RvdHlwZda4z/K1xM671sPDu7Hko6mjrLWrysfWu9KqUGVyc29utcRwcm90b3R5cGXW2NDCuLMmIzIwNTQwO6Os1rjP8sHLwe3N4tK7xqzE2rTmo6zS1LrzyfnD97XEUGVyc29uttTP877NsrvE3LrN0tTHsFBlcnNvbrbUz/O5ss/txNq05sHLo6zL/MPHtcTBqs+1vs274cfQts+jrGHKx7fDzsqyu7W9c2V4yvTQ1LXEoaM8L3A+CjxwPrTLzeKjrM7Syc/D5tf2tcTI/bj2yrXR6crHzqrBy9Hp1qRwcm90b3R5cGXK9NDUxNy38biyuMfA4LnM09DK9NDUo6y08LC4z9TIu7K7xNyjrMv8w8e1xMTatObOu9bDtryyu9K70fmho8THztK+zdPQ0ru49s7KzOLBy6OsyOe5+3Byb3RvdHlwZcDvyfnD98HL0ru49rrNuczT0Mr00NTP4M2sw/vX1rXEyvTQ1KOswP3I51BlcnNvbi5wcm90b3R5cGUubmFtZT0="hello,world',那麼如何通過Person對象來訪問prototype的name屬性呢?
我的理解就到此結束,上面所述如有不對,請各位大神不吝指正,謝謝。