JavaScript原型鏈學習

來源:互聯網
上載者:User

標籤:enum   images   構造   let   定義   例子   學習   自己   而在   

function foo(){}foo.prototype.z = 3;var obj = new foo();obj.y = 2;obj.x = 1;obj.x; //1obj.y; //2obj.z; //3typeof obj.toString; //‘function‘‘z‘ in obj; //trueobj.hasOwnProperty(‘z‘); //false



 

首先,我們通過function foo()去定義一個函數對象。。那麼,foo()對象自動帶有prototype對象屬性,添加了z屬性。再通過new構造器,構造obj對象,,obj的原型指向構造器的prototype屬性也就是foo.prototype。

再看例子:obj.x和obj.y會在obj對象上找到x,y屬性,而obj上沒有z屬性,當obj.z時,obj上沒有z,此時就會尋找原型上的屬性,發現z=3。

foo.prototype的原型是Object.prototype,Object.prototype的原型是null。Object.prototype的作用是:,typeof obj.toString是一個‘function’,而在ibj以及它的原型上都找不到toString方法,而js中預設的對象上基本都有toString方法,是因為他們的原型指向null之前都會指向Object.prototype,toString正是Object.prototype上的方法。

obj. hasOwnProperty(‘z‘)返回false,表示z屬性並不是直接為obj的屬性。

 

 

obj.z = 5;obj.hasOwnProperty(‘z‘); //truefoo.prototype.z; //still 3obj.z; //5obj.z = undefined;obj.z; //undefineddelete obj.z; //trueobj.z; //3delete obj.z;  //trueobj.z; //still 3!!!

像代碼中所寫,obj.z = 5;對於賦值來說,先在obj對象上尋找,如果沒有,此時不會在原型鏈中尋找,而是在這個對象上添加z=5;foo.prototype.z依舊為3。

當obj.z=undefined時,obj對象上z屬性的值被修改為undefined,所以返回undefined時不一定代表不存在。

當delete obj.z後,拿到z的值為原型上的z的值。obj上的z屬性已經被刪除。

 

原型鏈上大部分屬性的 Enumerable(可枚舉)標籤都是false,也就是說console.log一個對象的時候都只顯示自己的對象,而在控制台能看到很多屬性

屬性標籤有:value:true,writeable:true(是否可寫),enumerable:true(是否可枚舉),configurable:true(表示前面這些屬性是否可修改)

JavaScript原型鏈學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.