標籤: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原型鏈學習