所有對象都有prototype,prototype自身也是對象,它有prototype,這樣就形成了prototype鏈。當遇到有鏈中為null時,鏈就終止了,object的prototype就是null.
上面內容http://www.javaeye.com/article/53537有介紹,
然而有太多問題需要想明白了。
prototype它是一種資料結構,還是別的什麼。
function class1(name)
{
this.class1Name=name;
}
function class2(name)
{
this.class2Name=name;
}
function class3(name)
{
this.class3Name=name;
}
class3.prototype=new class1('class1');//把一個對象class1替換(用這個詞感覺不對)prototype
class3.prototype.abc='abc';然而此時還能通過prototype添加屬性。 目前按照我的理解,prototype不是一個簡單的對象。
class3.prototype=new class2('class2');//這一步後abc屬性就不存在了。
接下來說一下對象對屬性的訪問。
這個是上面連結中的原話:
讀操作會讀取在obj自己和prototype 鏈上發現的第一個同名屬性值
寫操作會為obj對象本身建立一個同名屬性(如果這個屬性名稱不存在
這裡要注意同名屬性,如下
function class1()
{
this.className='class1';
}
function class2()
{}
class2.prototype=new class1();
alert(new class2().className)//這裡結果為class1;說明訪問到了class1中的className屬性。
class2.prototype.class1=new class1();
alert(new class2().className)//這裡結果為undefined,說明沒有訪問到className屬性。
所以在屬性訪問上是根據屬性名稱的,就算這個屬性held的是一個對象。而不會去訪問到下面的prototype中去。
下面說一下this這個關鍵字。
function class1(name)
{
this.user=name;
}
class1.prototype=
{
firstName:function()
{
return this.user;
}
}
function class2(name)
{
this.name=name;
}
class2.prototype=new class1('class1');
alert(new class2('class2').firstName());//這裡結果應該能想到是class1.
但是如果這樣寫,把function class1的的代碼改成如下:
function class1(name)
{
this.name=name;
}
class1.prototype=
{
firstName:function()
{
return this.name;
}
}
alert(new class2('class2').firstName());//此時輸出的結果就是class2;
開始class2訪問firstName方法,它便在自己成員中尋找,沒有找到,就在prototype中尋找。這時它在class1中找到了fristName
而class1中firstName方法返回this.name,這個this指的還是class2.所以它又會在class2的成員中尋找。所以這裡的結果是class2;
對JavaScript一直都不太清楚,現在更迷惑了。希望明白人說一下。
另外Function 和Object是個奇怪的東西。