原型
js中每個函數(shù)都會有一個 prototype 屬性魄幕,該屬性指向原型鏈上的某一個對象; 這個對象中的所有的屬性都會被該函數(shù)的實例所繼承占拍,即該函數(shù)所有的實例中的 __proto__ 屬性都會指向這個對象,說明prototype 指向的對象就是 函數(shù)實例的原型宾符;
var a = function(){};?
a.prototype.x = 1;
var b = new a();
a.prototype? ? //{x: 1, constructor: ?}
b.__proto__? //{x: 1, constructor: ?}
a.prototype == b.__proto__? //true
b.x === 1? //true
a.x=== undefined? ? //true;
注:所有不屬于? “常規(guī)函數(shù)實例”? 的對象佛南,他們的__proto__都會指向 Object.prototype;
var obj = {} //同 var obj = new Object();
obj.__proto__ == Object.prototype? ? // true
原型鏈
原型鏈屬于 js 中的一個概念梗掰;并非一個特定的屬性和對象,原型鏈由對象的 __proto__串聯(lián)起來
js中一個對象嗅回,當(dāng)你訪問其中的一個屬性或方法的時候及穗,如果這個對象中沒有這個 方法或?qū)傩裕敲匆鎸L問這個對象的 __proto__ 屬性所指向的一個對 象(原型)绵载,并在那個對象中查找指定的方法或?qū)傩怨÷剑绻荒苷业剑蔷蜁^續(xù)通過那個對象 的__proto__ 屬性指向的對象進行向上查找娃豹,直到這個鏈表結(jié)束(即:一直找到? Object.prototype )焚虱。
例:
Object.prototype.mytest= "1";
var arr = [];
var str ="1111";
arr.mytest == "1" //true?
str.mytest == "1" //true
之所以返回 都為 true 是因為:
arr.__proto__ == Array.prototype; //true
Array.prototype.__proto__ ==? Object.prototype? //true
所以有了 :
??arr.__proto__?.__proto__ ==? Object.prototype? //true
?arr.mytest == "1" //true ;懂版;鹃栽;上面的 str 同理