最近在論壇看到一篇帖子關於prototype斷鏈的,原文如下
var sound = };
function person() ;
person.prototype = sound;//----早點綁上去----
var fo1o = new person();
var ******=person.prototype;//----遲了綁上去----??
******.yyyy="yyyy_";
alert(fo1o.echo);//alert(undefined);
alert(fo1o.yyyy);//alert(undefined);
var sound = };
function person() ;
var fo1o = new person();
person.prototype = sound;//----遲了綁上去----
var ******=person.prototype;//----遲了綁上去----??
******.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類中copy了乙份,但是prototype指向的記憶體還是一樣,這裡可以把prototype看做乙個指標。所以所有person物件都可以共享prototype的屬性和方法(只要person的prototype指向的位置沒變),但是只要person的prototype重新賦值,指向了另外一片記憶體,以後宣告的person物件就不能和以前person物件共享記憶體了,它們的聯絡就會切斷,a是訪問不到***屬性的。
此外,我上面做的三個實驗是為了驗證prototype屬性能否覆蓋類固有屬性,答案顯然不能,它們的記憶體位置都不一樣。那我就有乙個問題了,如果prototype裡宣告了乙個和固有屬性相同名字的屬性,例如person.prototype.name='hello,world',那麼如何通過person物件來訪問prototype的name屬性呢?
我的理解就到此結束,上面所述如有不對,請各位大神不吝指正,謝謝。
原型跟原型鏈 prototype跟proto
1.原型跟原型鏈 每個物件都有乙個原型物件,物件是以其為模板,從原型繼承方法和屬性。原型物件也有原型,並從中繼承方法跟屬性,一層一層,這種關係就是原型鏈。這些屬性跟方法是定義在object的建構函式的prototype屬性上的,而非物件例項本身。在傳統的物件導向語言中,是通過定義乙個類,此後建立物件...
javascript之工廠模式
工廠模式,根據不同的引數來產生不同的物件 23中設計模式之一 需求 產生不同的手機物件 var p1 批量的產生物件,根據具體引數來確定屬性 function phone color,size,cpu object型別 obj.color color obj.size size obj.cpu cp...
JavaScript學習之排序
陣列的排序 1.陣列排序arr1 4,5,6,2,3,8,1,0,7 function add a,b document.write arr1.sort add 從小到大排列。a在js中表示前乙個數,b表示後乙個數,我理解為若差值為負,則順序不變,若差值為正,則a與b交換順序 function ji...